プログラムする方法については、デバッガのスレッドIDEAコード]タブから詳細で

I.背景

今日の学生@段落における技術グループは、デバッグIDEA、スレッドオプションカード、​​デジタルのバックは、あなたが何を意味するのか非常に興味深い質問を、提起しましたか?


一部の学生は、コードの行数と言いました。しかし、我々は、コードの一部がどのような地獄であるコードの行数でなく、-1、ではないことがわかりましたか?

我々は非常にこの問題から、学習する方法を、分析する方法を教えてくれます。

 

第二に、研究

推測2.1

我々は明らかにあなたにいくつかのリファレンスデバッグを与えるために、それはインターフェイスをデバッグしているすべての最初の、文脈を推測しています。

数が結腸であるので、この数は関数および機能または関係を表すべきである前に、最も直接的なソース行番号または関数バイトコードことが理解されよ。

しかし、-1不可解なああ?

 

情報へのアクセス2.2

この時、私たちのスタイルに合わせて、間違いなくJLSおよびJVMがチェックしよう(私はこれはJAVAエンジニア2つの仕様だと思う必要な人材が、私は仕事のことであっても1〜2年は、恥ずかしい、必要に応じていたと考えています)。

https://docs.oracle.com/javase/specs/index.html

 

しかし、これは明らかにIDEAが提供する特性であると起動するIDEA自身で始まる、虐殺の鶏Yanyongチョッパー、。

 

2.3 IDEAデバッグツール自体

もちろん、最も簡単には直接文書のデバッガ使用IDEA部分をチェックすることで、あなたは答えを見つけることができるはずです。

https://www.jetbrains.com/help/idea/debug-tool-window-threads.html

https://www.jetbrains.com/help/idea/customize-threads-view.html

私たちは、見ていない、独自の分析をふり:

一般的に、我々がしようとしてますが、メニューの右を呼び出すことができ、機能を変更したり、いくつかの追加の操作を実行したいです。

私たちは、ドロップフレームを発見した(非常に重要な、非常に良いではなく、この議論の範囲内)、輸出スレッド、フィルターをステッピング追加.. カスタマイズスレッドビュー... 4つのオプション。

、「カスタマイズスレッドビュー」またはそれがないので、どのような手掛かり意志「カスタムスレッドは、ビュー」輝きますか?

どうやら「表示行数」で最も疑わしい、このオプションは、上のデジタルおよび関連するビューですので

私たちは、このオプションを削除することができるようにスレッドを観察した後に数字が消失する前にやること、効果が表示されます。

したがって、この図は、行番号(行番号)の関数であると結論付けることができます。

また、当社は、観測された行番号とソースコードの間の対応する関数対応をダブルクリックして、戻って回復します。

私たちは、サードパーティ製のジャーパッケージまたはネイティブコードの行数は、行番号は、対応するソースコードの行番号であることがわかります。

しかし、JDKのソースコードのために、ソースコードの行番号と行番号は、に対応していない、図62のソースコードの行27にジャンプ対応する機能上のクリックを倍増 Editorはないですか、?

我々が想定して、それはそれの行数バイトコード機能でしょうか?

逆アセンブル、ソースコードの行番号を見て必要てjavap:

javap -c -l sun.reflect.NativeMethodAccessorImpl

Compiled from "NativeMethodAccessorImpl.java"
class sun.reflect.NativeMethodAccessorImpl extends sun.reflect.MethodAccessorImpl {
  sun.reflect.NativeMethodAccessorImpl(java.lang.reflect.Method);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method sun/reflect/MethodAccessorImpl."<init>":()V
       4: aload_0
       5: aload_1
       6: putfield      #2                  // Field method:Ljava/lang/reflect/Method;
       9: return
    LineNumberTable:
      line 39: 0
      line 40: 4
      line 41: 9

  public java.lang.Object invoke(java.lang.Object, java.lang.Object[]) throws java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
    Code:
       0: aload_0
       1: dup
       2: getfield      #3                  // Field numInvocations:I
       5: iconst_1
       6: iadd
       7: dup_x1
       8: putfield      #3                  // Field numInvocations:I
      11: invokestatic  #4                  // Method sun/reflect/ReflectionFactory.inflationThreshold:()I
      14: if_icmple     94
      17: aload_0
      18: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      21: invokevirtual #5                  // Method java/lang/reflect/Method.getDeclaringClass:()Ljava/lang/Class;
      24: invokestatic  #6                  // Method sun/reflect/misc/ReflectUtil.isVMAnonymousClass:(Ljava/lang/Class;)Z
      27: ifne          94
      30: new           #7                  // class sun/reflect/MethodAccessorGenerator
      33: dup
      34: invokespecial #8                  // Method sun/reflect/MethodAccessorGenerator."<init>":()V
      37: aload_0
      38: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      41: invokevirtual #5                  // Method java/lang/reflect/Method.getDeclaringClass:()Ljava/lang/Class;
      44: aload_0
      45: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      48: invokevirtual #9                  // Method java/lang/reflect/Method.getName:()Ljava/lang/String;
      51: aload_0
      52: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      55: invokevirtual #10                 // Method java/lang/reflect/Method.getParameterTypes:()[Ljava/lang/Class;
      58: aload_0
      59: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      62: invokevirtual #11                 // Method java/lang/reflect/Method.getReturnType:()Ljava/lang/Class;
      65: aload_0
      66: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      69: invokevirtual #12                 // Method java/lang/reflect/Method.getExceptionTypes:()[Ljava/lang/Class;
      72: aload_0
      73: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      76: invokevirtual #13                 // Method java/lang/reflect/Method.getModifiers:()I
      79: invokevirtual #14                 // Method sun/reflect/MethodAccessorGenerator.generateMethod:(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;I)Lsun/reflect/MethodAccessor;
      82: checkcast     #15                 // class sun/reflect/MethodAccessorImpl
      85: astore_3
      86: aload_0
      87: getfield      #16                 // Field parent:Lsun/reflect/DelegatingMethodAccessorImpl;
      90: aload_3
      91: invokevirtual #17                 // Method sun/reflect/DelegatingMethodAccessorImpl.setDelegate:(Lsun/reflect/MethodAccessorImpl;)V
      94: aload_0
      95: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      98: aload_1
      99: aload_2
     100: invokestatic  #18                 // Method invoke0:(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
     103: areturn
    LineNumberTable:
      line 49: 0
      line 50: 21
      line 51: 30
      line 53: 41
      line 54: 48
      line 55: 55
      line 56: 62
      line 57: 69
      line 58: 76
      line 53: 79
      line 59: 86

// 看这里!
      line 62: 94

  void setParent(sun.reflect.DelegatingMethodAccessorImpl);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #16                 // Field parent:Lsun/reflect/DelegatingMethodAccessorImpl;
       5: return
    LineNumberTable:
      line 66: 0
      line 67: 5
}

逆アセンブルした後、明白な言葉が迎え:明らかに「LineNumberTable」、行番号テーブル内を。

明らかに、テーブル内の行番号を示し、上記のコードに対応する行62 94。

それは光源103によって示される機能に対応するコードの94〜27行からずれています。

したがって、代わりの分解ソースの行番号JDKコードの行番号に対応する行番号をされていることが分かります。

だから、-1とは何を表していますか? 

方法に対応するソースコードに二Invoke0は、JDKネイティブ、ダブルソースが実行入る見つかった未知の障害を発見します。

したがって、それは推定、-1未知ネイティブ関数または位置の関数(例えば、ラムダ式の構文)を表します。

 

この時点で、バックでの公式文書のセクション2.2を読み取ります

https://docs.oracle.com/javase/specs/index.html

「行番号」JVMS対応する章を探す:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.12

 

LineNumberTable 属性は、オプションで、可変長の属性である  attributes のテーブル  Code 属性(§4.7.3)。それのどの部分かを決定するためにデバッガによって使用されることができる  code 元のソースファイル内の指定された行番号にアレイ相当します。

複数の場合は  LineNumberTable 属性が中に存在している  attributes のテーブル  Code 属性、それらはどのような順序で表示されることがあります。

複数があるかもしれません  LineNumberTable 属性  のソース・ファイルの行ごと  に  attributes テーブル  Code 属性。つまり、  LineNumberTable 属性が一緒にソース・ファイルの指定された行を表し、そして必要一対一のソース線を有するではないかもしれません。

//省略パーツ

line_number_table []

各エントリ  line_number_table アレイは、元のソースファイル内の行番号がで与えられた点で変化することを示している  code アレイ。各  line_number_table エントリには、次の2つの項目が含まれている必要があります。

なstart_pc

値  start_pc アイテムはへのインデックスを指定する必要があり  code 、元のソースファイル内の新しい行のコードが始まる配列。

値は、  start_pc の値よりも小さくなければなりません  code_length の項目  Code これはその属性  LineNumberTable 属性です。

LINE_NUMBER

値  line_number 項目は、元のソースファイル内の対応する行番号を与えなければなりません。

それのどの部分かを決定するためにデバッガによって使用されることができる  code 元のソースファイル内の指定された行番号にアレイ相当します。

フレーズ内のこの文は:デバッガとの関連するソースコード・アレイの行番号との対応のために使用することができます

すなわち:デバッガはLineNumberTable、ソースコードと対応分解によって関連させることができます。

 

マッピング・コードの開始位置までのソース・ファイル内の記録ライン番号をLineNumberTable。

解体ラインコード94に対応する、すなわちライン62。

 

 

第三に、だと思います

  • あいまいな問題が多くの知識を隠すことが、なぜいくつかを尋ねるために、収穫は完全に異なっています。
  • 大胆憶測、慎重なフォレンジック多くの人々が事実として推測しますが、多くの人が直接考えず尋ねた問題を抱えているがあります。ほとんどのコンテキストと既存の知識の推測に応じて、最初の出会いの問題は次のようになり、その後、確認する必要があります。
  • IDEAに精通していることには、なじみのないメニューは、特定の好奇心を持っています
  • 公式ハンドブックは、(などのJava言語仕様、JVM仕様、春の公式文書を含む)最高の参考資料であると言うことができるが、実際に多くの人が注意を払っていません!
  • 快適ゾーンから抜け出すためにあえてするには、あなたがより多くの深い学ぶのを助けることができ、そのようなてjavapのを逆アセンブルなどの良いツールを使用してみてくださいしかし、多くの人々も数年は積極的にこのコマンドを使用し動作しませんでした。年間デバッグコードを単一のステップのみ、なりません「ロールバック」を使用してデバッグマルチスレッド化されませんので、上のコールスタックの左下隅にない注意を払うを行います。唯一のマルチ知っている、とドグマはBaiduの夏になるラクダのではなく、画期的な各種をしようとするより多くの機会を持っています。
  • アイデアをトラブルシューティング答えそのものよりもさらに、非常に重要です。答えはちょうどメッセージであることを忘れないでください、この方法では、法の普遍的な知識が可能です多くの人が問題の無力を持って、ソリューションのN種類を有することができる人もありますが、多くの人が数時間、あるいは一日か二日のために問題を解決するために、いくつかの人々はすぐに問題で突破口を見つけることができます。主に強固な基盤、厳格なロジックかどうか。
  • 多くの人が軽蔑する問題のいくつかは、最も恐ろしいことは、彼らは知らない、知らないんです本当のスキルは、多くの場合、小さな問題にも反映されていますが、本当に理解していません私たちは自分自身をアップグレードするために、知識への謙虚なアプローチを維持しなければなりません。

 

-------------------------------------------------- ---

私はプログラマCSDN 1024のイベントを見ます

私はあなたを助けるためにブログを持っている、と私は賞賛の私のポイントを支援するためのマイクロチャンネルスキャンコードブラウザを歓迎する時間がある場合:

 

 

 

公開された379元の記事 ウォンの賞賛862 ビュー132万+

おすすめ

転載: blog.csdn.net/w605283073/article/details/102528646