問題タブ [stack-trace]
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.
java - javaで例外をスローせずにスタックトレースをダンプする方法はありますか?
Java アプリケーション用のデバッグ ツールを作成することを考えています。
Exception.printStackTrace()
実際に例外をスローすることなく、スタック トレースを取得できるかどうか疑問に思っています。
私の目標は、特定のメソッドでスタックをダンプして、メソッドの呼び出し元が誰であるかを確認することです。
.net - Visual Studio でスタック トレースを見つけるにはどうすればよいですか?
発生した例外をデバッグしているときに、Visual Studio でスタック トレースが見つからなかったので質問します。
perl - Perl: $SIG{__DIE__}、eval { }、およびスタック トレース
次のような Perl コードがあります (大幅に簡略化されています): ネストされたサブルーチン呼び出し (実際にはメソッド) にはいくつかのレベルがあり、内部のいくつかは独自の例外処理を行います:
次に、そのコードを次のように変更します。
最も外側のレベルまで「バブルアップ」するすべての例外の完全なスタック トレースを出力します (
sub outer
)。具体的には、スタック トレースが " " の最初のレベルで停止しないeval { }
ようにする必要があります。内部レベルの実装を変更する必要はありません。
現在、これを行う方法は、サブ__DIE__
内にローカライズされたハンドラーをインストールすることです。outer
[編集: 間違いを犯しました。上記のコードは実際には思い通りに動作しませんmiddle
。実際には、サブルーチンの例外処理をバイパスします。だから私は質問が本当にあるべきだと思います:私が望む動作は可能ですか?]
これは完全に機能します、唯一の問題は、私がドキュメントを正しく理解していれば、明示的に廃止された動作に依存している__DIE__
ことdie
ですeval { }
。と の両方perlvar
でperlsub
、この動作は Perl の将来のバージョンで削除される可能性があると述べています。
非推奨の動作に頼らずにこれを達成できる別の方法はありますか、それともドキュメントが別のことを言っていても頼りにできますか?
c - HP-UX および Linux でのスタックの巻き戻し
特定の時点で C アプリケーションのスタック情報を取得する必要があります。ドキュメントを読み、ネットを検索しましたが、どうすればよいかわかりません。簡単なプロセスの説明を教えてください。または、さらに良いのは、スタックの巻き戻しの例です。HP-UX (Itanium) と Linux で必要です。
python - テールコールの最適化を実装するために、jvm は何を犠牲にする必要がありますか?
テールコールの最適化がないという制限 (clojure 実装ではなく jvm の制限) を除けば、clojure 実装は優れていると人々は言います。
http://lambda-the-ultimate.org/node/2547
TCO を Python に実装すると犠牲になると言われてきました
- スタック トレース ダンプ、および
- デバッグの規則性。
テールコール最適化の重要性と、Python がそれを必要とする理由を説明してください
TCO の jvm 実装のために同じ犠牲を払わなければならないでしょうか? 他に何かを犠牲にする必要がありますか?
c# - これまでに生成されたスタックトレースを維持しながら、内部例外を再スローするにはどうすればよいですか?
重複:C#で、スタックトレースを失うことなくInnerExceptionを再スローするにはどうすればよいですか?
バックグラウンドスレッドで非同期的に呼び出す操作がいくつかあります。時々、物事は悪くなります。これが発生すると、TargetInvocationExceptionが発生する傾向がありますが、これは適切ではありますが、まったく役に立ちません。私が本当に必要としているのは、次のようなTargetInvocationExceptionのInnerExceptionです。
そうすれば、発生したREAL例外が発信者に提供されます。問題は、throwステートメントがスタックトレースをリセットしているように見えることです。基本的に内部例外を再スローしたいのですが、元々持っていたスタックトレースを保持します。それ、どうやったら出来るの?
明確化: 内部例外のみが必要な理由は、このクラスが、これらの関数(呼び出し元によって提供されたデリゲート)が他のスレッドなどで実行されているという事実全体を「抽象化」しようとするためです。例外がある場合、それはバックグラウンドスレッドで実行されることとは何の関係もない可能性があり、呼び出し元は、呼び出しの呼び出しではなく、デリゲートに入り、実際の問題を見つけるスタックトレースを本当に望んでいます。
c# - .net のユーザー バグ レポートからの行番号でスタック トレースを再作成しますか?
まず、問題があります。 私はいくつかのフリー プロジェクトを持っていますが、どのソフトウェアにもバグが含まれています。バグに遭遇したときに、スタックトレースを含むバグレポートを送ってくれる仲間のユーザーもいます。障害の場所を簡単に見つけるために、このスタック トレースの行番号を確認したいと考えています。アプリケーションが .pdb ファイルなしで出荷された場合、すべての行情報が失われるため、現在、すべてのプロジェクトが .pdb ファイルでデプロイされているため、生成されたスタック トレースにはこの番号が含まれます。しかし!しかし、私はこのファイルをディストリビューションで見たくないので、すべての .pdb を削除したいと考えています。ユーザーを混乱させたり、インストーラーのスペースを消費したりします。
Delphi ソリューション: 昔、私が Delphi プログラマーだったとき、次の手法を使用していました。例外が発生した場合、アプリケーションはスタック上を歩き、アドレスを収集します。次に、バグ レポートを受け取ったときに、収集したアドレスと、MY マシンにある対応するシンボル ファイルに基づいて、関数名と行番号を使用して有効なスタック トレースを再構築するツールを使用しました。
質問: .NET で同じことを行うための lib やテクニックなどはありますか?
ステータスの更新:非常に興味深いことです。多くの場合、質問をすることが独自の調査を開始するための最良の方法です。たとえば、私はこの問題についてしばらく考えていましたが、数日前に答えを探し始めました。
オプション 1: MiniDumps。多くのグーグル検索の後、コードからミニ ダンプを作成する方法と、マネージド ミニ ダンプからスタックを再作成する方法を見つけました。
- ミニ ダンプ フォーム コードを作成するための再頒布可能アセンブリ - clrdump
- 以前のアセンブリの使用に関するブログ投稿 - .NET 運用アプリケーションでのミニダンプの作成と分析
ただし、このソリューションでは、2 つの追加アセンブリ (サイズが最大 1 MB) を再配布する必要があり、ミニ ダンプにはある程度のスペースが必要であり、ユーザーがそれらを電子メールで送信するのは不快です。したがって、私の目的からすると、現時点では受け入れられません。
オプション 2: 手がかりをくれた weiqure に感謝します。スタック フレームごとにマネージド IL オフセットを抽出できます。問題は、このオフセットに基づいて .pdb から行番号を取得する方法です。そして、私が見つけたもの:
- PDB ファイルの内部、参考までに:
- ISymbolReader - プログラム データベース ファイルを読み取るためのマネージド インターフェイス
- 最後に、.pdb ファイルを構造化 xml に変換してxpath 処理を容易にするツール
このツールを使用すると、リリース ビルドごとに xml ファイルを作成し、それらをリポジトリに配置できます。ユーザーのマシンで例外が発生した場合、IL オフセットを使用してフォーマットされたエラー メッセージを作成できます。次に、ユーザーはこのメッセージ (非常に小さい) をメールで送信します。最後に、フォーマットされたエラー メッセージから結果のスタックを再作成する簡単なツールを作成することができます。
なぜ誰もこのようなツールを実装しないのだろうか? これが私だけにとって興味深いものだとは思いません。
java - printStackTrace() で完全なコール スタックを出力しますか?
私のプロジェクトで使用されているサードパーティのクローズド ソース ライブラリ (内部にカスタム ロガーがある) によって生成されたいくつかのログ ファイルを処理するために、小さなログ アナライザー アプリケーションを作成する必要があります。
ログに例外エントリがある場合は、スタック トレースに沿って、トップから実際の例外の場所まで、関連するメソッドに関する集約情報を収集する必要があります。
残念ながら、デフォルトでは、Java printStackTrace() はコール スタック内のすべてのメソッドを出力するわけではありませんが、特定の数までは出力し、残りは単に として参照され16 more...
ます。
自分で例外をキャッチできる場合は、getStackTrace() を使用して自分で出力しますが、このライブラリがスローする例外には根本的な原因が含まれていません。
スタックトレースにコールスタック全体を出力するようJavaに依頼する方法はありますか?
私の状況とは別に、一般的なロギング フレームワークにはこのオプションがありますか?
編集:プログラムは、Sun の JVM と JDK 1.5.0_09 で実行されます。それを変更するオプションはありません。
.net - .NET でアプリケーションのスタック トレース全体をログに記録する方法
約 40 のアクティブなプロジェクトを持つ既存の.NETアプリケーションの作業を開始したばかりです。プロジェクトに慣れていると、構造とロジック フローを学ぶためだけに、常にアプリケーションをステップ実行していることに気づきます。アプリケーションを実行してすべてのメソッド呼び出しをログに記録し、後でログを確認できれば、このプロセスは非常に簡単になります。Debug.WriteLine
orステートメントを追加できることはわかっていますTrace.WriteLine
が、これらのステートメントを 40 のプロジェクトのほとんどのメソッドに追加するのはやり過ぎに思えます。このアプローチに代わる良い方法はありますか?
CLR プロファイラーは、適切なキーワード「コール グラフ」を紹介してくれました。これにより、「.NET プログラムの動的コール グラフの視覚化を表示するにはどうすればよいですか? .
stack-trace - Java で現在のスタック トレースを取得するにはどうすればよいですか?
.NET でできるように、Java で現在のスタック トレースEnvironment.StackTrace
を取得するにはどうすればよいですか?
見つけましThread.dumpStack()
たが、それは私が望むものではありません-スタックトレースを取得したいのですが、印刷するのではありません。