問題タブ [stack-frame]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#(またはCIL)で現在のスタックフレーム内のすべてのローカル変数を取得する簡単な方法はありますか?
ここで見ることができる(現在および前のすべてのフレームからの)スタック内のすべての変数をダンプしたかった私の前の質問に続いて:C#で実行時にスタック変数を調べる方法はありますか?
このようなタスクを簡素化するために、呼び出しを手動でインターセプトするか、PostSharpなどのAOPフレームワークを使用することをお勧めしました。PostSharpを調べましたが、インターセプト引数に現在のスタックフレームの変数が含まれていません。現在のスタックフレーム内のすべてのローカル変数を自動的に取得する簡単な方法があるのだろうか。コード分析を実行して、それらすべての値をコレクションにコピーするコードを生成できると思いますが、それを実行する組み込みのメカニズムがあるかもしれません。
提案を事前に感謝します。
編集:私はこれをしたい理由の詳細を与えるべきでした。メソッドの途中で実行を一時停止できるようにしたい。スタックの内容があれば、後で実行を再開したり、シリアル化して別のマシンで続行したりすることもできます(比較的単純なコードであるため、スレッドやI / Oはありません)。この状態を保存する追加のコードを自動的に生成できるコード分析ツールを実行しても問題ありません。これを行うには、おそらくCILを分析する必要があると思います。
c# - 再スローせずに切り捨てられた例外呼び出しスタック
非常に単純な例外がスローされ、同じメソッドでキャッチされるという珍しいケースがあります。 それは再スローされません(ナイーブなプログラマーが抱える通常の種類の問題)。それでも、そのStackFrameには現在のメソッドが1つだけ含まれています。外観は次のとおりです。
実際には、VS2010デバッガーの呼び出しスタックには、これに至るまでにおそらく30のメソッドがあり、半ダースの異なるアセンブリにまたがっています。これらすべてを最適化することは不可能のようです。さらに、このコードは、.NET 4用に、最適化なしでデバッグモードで構築されています。( http://msdn.microsoft.com/en-us/library/9dd8z24x.aspxに基づいて).iniファイル(1つを含む)もあります。同じフォルダ内の[app].vshost.ini)という名前:
また、メソッド呼び出しはメソッドの最後ではないため、末尾再帰の最適化はさらに可能性が低いようです。
それがどのように呼び出されるかについて:呼び出しスタックでのリフレクションの使用はなく、いかなる種類のInvoke()またはBeginInvoke()もありません。これは、ボタンのクリックからの呼び出しの長いチェーンです。クリックハンドラーは、コールスタックを約10回呼び出します。その下には、通常のWndProc、NativeWindow.Callback、ネイティブ/マネージドトランジション、およびメッセージループがあります。これは最終的に、C#EXEアセンブリから実行されるShowDialog()呼び出しの内部にあります。
これで、catchハンドラーでStackTraceクラスのインスタンスを作成できることがわかりました。また、Exceptionオブジェクトを渡すと、呼び出しスタックも短くなります。代わりに、引数なしでnew StackTrace()を呼び出すと、完全な呼び出しスタックが生成されます。
例外クラスの内部がスローされ、その呼び出しスタックが構築されるようにデバッグするためにReflectorを使用しましたが、ExceptionまたはStackTraceにブレークポイントを設定できませんでした。それらをEnvironment.GetStackTrace()で設定でき、このメソッド(Exceptionが呼び出す)は、構築およびスロープロセス中に呼び出されないように見えますが、デバッガーが実際に正しく機能しているかどうかはわかりません。(ただし、このメソッドは他のいくつかの目的でトリガーされるため、どうすればよいかわかりません。)
メソッドの抜粋は次のとおりです。
非常に簡単です。例外をスローし、キャッチしてログに記録します。
デバッガーでもスタンドアロンでも同じ結果が得られます—1行の呼び出しスタック。そして、私はこの問題をコードベースの他の場所で見たことがあることを知っています。以前は、例外を再スローしたことが原因だと思っていましたが、多くの場合、最初のcatchブロック内にログを記録します。私はかなり困惑していて、私が行ったすべてのWeb検索は何も生成していません。
これは、提供された回答にコメントとして追加するには少し多すぎますが、ここにいくつかの詳細情報があります。
この動作は http://dotnetthoughts.wordpress.com/2007/10/27/where-did-my-exception-occur/で説明されており、実際にはhttp://msdn.microsoftで説明されていることがわかります。 com / en-us / library / system.exception.stacktrace.aspx(ただし、彼らがそこで言っていることを簡単に見逃す可能性があると思います)。
ですから、私の「解決策」はちょっとした失敗になると思います。例外をフォーマットするために通常呼び出す中央メソッドがあります。そのメソッド内で、Exceptionオブジェクトがある場合とない場合の両方で新しいStackTrace()を作成します。次に、Exceptionのスタックトレースの一番下にあるメソッドを探し、その下にあるすべてのものを新しいStackTrace()に表示して、一連の呼び出しによって呼び出されたことを示します。
もちろん、欠点は、この方法を使用しないと、情報がそこにないことです。しかし、私はどこかで何らかのコード変更を期待しなければなりませんでした。
c# - メソッドが呼び出されたメソッドを取得しますか?
PostErrorで呼び出しメソッド名「Eat Pizza」を特定することはできますか? 引数の 1 つとして "EatPizza" を渡すことができると思いますが、メソッド名が変更されるたびに変更が必要になります (不要なメンテナンス)。しかし、その後、「EatPizza」のコンテキストでメソッド名「EatPizza」を見つけることさえできませんでした (stacktrace、getframe、getmethod を使用)。
StackTrace.GetFrame でさまざまな値 (0 から StackTrace.FrameCount-1) を試すと、「EatPizza」だけが必要なときに次の値が得られます。
reflection - プロパティの5つのレベルを反映しますか?
Enterprise Library 5で使用するCustomTraceListenerを実装しました。TraceDataメソッドから、実際のロギング呼び出しがあったクラスまでスタックを6レベル上にクロールする必要があり、そこからプロパティが必要です。StackFrameを登るのは、オブジェクトではなくクラスのみを取得するため、私は望んでいないと思いますよね?必要な(文字列)プロパティを取得するための最良の方法は何ですか?
これはFramework4.0にあります。ありがとう。
assembly - アセンブリで ENTER と LEAVE ?
The Art of Assembly Language (Randall Hyde、Amazon へのリンク) を読んでいて、その本のコンソール アプリケーションを試してみました。それは、Win32 API 関数を使用して、自分自身の新しいコンソールを作成するプログラムでした。LENSTR
このプログラムには、文字列の長さをEBP
レジスタに格納するというプロシージャが含まれています。この関数のコードは次のとおりです。
enter
ここでおよびleave
コマンドの使用法を説明していただけますか?
assembly - 「enter」vs「push ebp; mov ebp、esp; sub esp、imm」および「leave」vs「mov esp、ebp; pop ebp」
enter
とはどう違いますか
指示?性能差はありますか?もしそうなら、どちらが速いですか?なぜコンパイラは常に後者を使用するのですか?
leave
および と同様に
指示。
c# - ログ ファイル名、ログの行番号。StackFrame を渡す必要がありますか?
現在、現在のファイル/行番号を取得するために StackFrame を渡します。
Log クラスの場所:
毎回 StackFrame を Log.Message() メソッドに渡す必要がありますか? これは、それを渡さずにメソッド自体で実行できますか? もっと簡単な方法はありますか?
ありがとう。
gcc - GCC が 64 ビットでフレーム ポインタをドロップするのはなぜですか?
デフォルトで 64 ビット アーキテクチャでフレーム ポインタを削除する理由は何ですか? 有効にできることはよく知っていますが、32ビットで有効にしているのに、GCCが最初に無効にするのはなぜですか? 結局、64 ビットには 32 ビット CPU よりも多くのレジスタがあります。
編集:
最近の GCC バージョンを使用すると、x86 のフレーム ポインターも削除されるようです。マニュアルから:
GCC バージョン 4.6 以降、32 ビット Linux x86 および 32 ビット Darwin x86 ターゲットのデフォルト設定 (サイズを最適化しない場合) が -fomit-frame-pointer に変更されました。
-fno-omit-frame-pointer
configure オプションを使用して GCC を構成すると、デフォルトに戻すことが--enable-frame-pointer
できます。
しかし、なぜ?
smalltalk - Smalltalkはコールスタックフレーム(thisContext)をどのように操作しますか?
SmalltalkオブジェクトthisContext
は奇妙で素晴らしいように見えます。それが何で、どのように機能するのか理解できません。そしてそれがどのように継続を可能にするかさえ。
Cのコールスタックの場合、それがどのように実装され、機能しているかを簡単に想像できます。しかし、これのために...私はできません。私がそれを理解するのを手伝ってください。
java - Eclipse Javaデバッガーを使用して他のスタックフレームのインスタンス変数を表示するにはどうすればよいですか?
Eclipseデバッガーの下でJavaアプリのブレークポイントにいるとき、スタックフレームリスト(同じスレッド上)の別のフレームをクリックして、変数の一部を表示できることを期待しています。変数は1つだけで、これが含まれているものを明らかにすると、 blocker、blockerLock、contextClassLoader、daemon、me(これはこれだけのように見えます)などの特別なランタイム変数であると私が想定しているものだけが含まれているように見えます。
私が見たいのは、私のオブジェクトの1つのインスタンス変数です。ここでデバッガーを誤解していますか?