問題タブ [backtrace]

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.

0 投票する
1 に答える
12338 参照

macos - Mac OS X で現在のスタック トレースを取得する

Mac OS X の C++ アプリで現在のスタックを保存してから印刷する方法を考え出そうとしています。問題は実際にはコンパイル オプションであると思われますが、よくわかりません。

Darwin/Leopard のバックトレース コードを試してみましたが、dladdr が呼び出され、dladdr を呼び出す自分のコードと同じ問題が発生します。

元の投稿: 現在、次のコードでスタックをキャプチャしています:

これはうまくいくようです。次に、次のように dladdr を使用して、見ているスタックを印刷します。

これはほとんど機能しますが、出力例は次のとおりです。

共有オブジェクトのメソッド名は正しく取得されていますが、メインアプリのメソッド名は取得されていません。それらは単に「tart」(または「start」から最初の文字を引いたもの)にマップされます。

理想的には、その時点で行番号とメソッド名が必要です。しかし、初心者向けの正しい関数/メソッド名に落ち着きます。Linux では、独自の命令セットを持つプライベート ELF ブロック用に独自のパーサーを作成する必要があると聞いています。怖いですね。

とにかく、誰かがこのコードを整理して、メソッド名を正しく取得できますか?

0 投票する
4 に答える
1717 参照

c - backtrace() を使用するよりもコール スタックの深さを調べる安価な方法はありますか?

私のロギング コードはbacktrace()の戻り値を使用して現在のスタックの深さを判断します (きれいに印刷するため) が、プロファイリングから、これはかなり高価な呼び出しであることがわかります。

これを行うより安価な方法はないと思いますか?フレームアドレスは気にしないことに注意してください。フレームアドレスがいくつあるかだけです。

編集: これらのログ機能は大規模なコードベース全体で使用されるため、スタックの深さを手動で追跡することは実際にはオプションではありません。

0 投票する
9 に答える
6524 参照

c++ - クラッシュからデバッグ情報を抽出する方法

C++ アプリが Windows でクラッシュした場合、有用なデバッグ情報をサーバーに送信したいと考えています。

Linux では GNUbacktrace()関数を使用します。Windows に相当するものはありますか?

プログラムがクラッシュした後に有用なデバッグ情報を抽出する方法はありますか? それともプロセス内からのみですか?

(「クラッシュしないようにアプリをテストする」というアドバイスは役に立ちません! - 重要なプログラムにはすべてバグがあります)

0 投票する
12 に答える
63017 参照

php - エラー時にPHPにバックトレースを生成させるにはどうすればよいですか?

デフォルトの現在の行のみのエラーメッセージを使用してPHPをデバッグしようとすると、ひどいことになります。エラーが発生したときにPHPにバックトレース(スタックトレース)を生成させるにはどうすればよいですか?

0 投票する
2 に答える
1346 参照

c++ - 奇妙なバックトレース - エラーはどこにありますか?

C++ で画像処理アプリケーションを開発しています。多くのコンパイラ エラーとバックトレースを見てきましたが、これは初めてのことです。

ここで何が起こっているのですか?オペレーター new がクラッシュしています。しかし、なぜ?これはメモリ不足ではありません (それぞれ 2 つの float を持つ 128x64 ピクセルである約 128Kb を割り当てようとします)。また、自分のコードのエラーであるため、継ぎ目はありません (コンストラクターは触れられません!)。

上記の行 (#7) のコードは次のとおりです。

私のコードの他の場所でも、ほぼ同じインスタンス化が機能します。コードのこの部分をコメントアウトすると、少し後で同様の部分でクラッシュします。私はそれを理解していません、私はそれをデバッグする方法も考えていません。何か助けはありますか?

コンパイラは gcc 4.3.3、libc は 2.9 (どちらも Ubuntu Jaunty から)

アップデート:

同じメソッドと main() で、問題のある行のすぐ上に次の行を含めました。

奇妙なことに、同じメソッドではクラッシュしますが、main() ではクラッシュしません。前述したように、Complex は std::complex<float> の typedef です。コンストラクターは呼び出されません。この行の直前とコンストラクター自体に cout を挿入しました。

更新 2:

このヒントを提供してくれた KPexEA に感謝します。私はこれを試しました:

でクラッシュします-そうですか?- テスト2! したがって、私のkissfftシームのmallocは欠陥のあるものになります。見てみます。

最終更新:

よし、できた!皆さんのお陰で!

本当はもっと前から気づいていたはずなのに。先週、kissfft (高速フーリエ変換ライブラリ) が 128x128 ピクセルのソース画像から 130x64 ピクセルの fft 画像を作成していることに気付きました。はい、幅 128 ではなく 130 ピクセルです。理由は聞かないでください。したがって、以前考えていたように、128x64x ではなく、130x64x2xsizeof(float) バイトを割り当てる必要がありました。奇妙なことに、そのバグを修正した直後ではなく、数日後にクラッシュしました。

記録のために、私の最終的なコードは次のとおりです。

ありがとう!

クラッシュ

0 投票する
2 に答える
1939 参照

c++ - OS /XでのC++バックトレースの生成(10.5.7)

私はbacktraceとbacktrace_symbolsを利用して、ロギング/診断の目的でプログラムによるスタックトレースを生成してきました。大まかに機能しているように見えますが、少し混乱していて、各関数の呼び出しに関連付けられたファイル/行番号はありません(gdb bt呼び出しなどで予想されるように)。次に例を示します。

1レオナルド0x00006989 _ZN9ExceptionC2E13ExceptionType + 111
2レオナルド0x00006a20 _ZN9ExceptionC1E13ExceptionType + 24
3レオナルド0x0000ab64 _ZN5Rules11ApplyActionER16ApplicableActionR9GameState + 1060年
4レオナルド0x0000ed15 _ZN9Simulator8SimulateEv + 2179
年5レオナルド0x0000eec9 _ZN9Simulator8SimulateEi + 37
6レオナルド0x00009729 45 +メイン
7レオナルド0x000025c6スタート+ 54

私が何かを見逃している、何か愚かなことをしている、またはこれがOS / Xのバックトレースから期待できるすべてですか?

他のいくつかのヒント:

  • rdynamic使用しているg++バージョン(4.0.1)のリンクオプションが表示されません。
  • -g/-g3違いはありません。
  • abi::__cxa__demangle何もしていないようです

  • 0 投票する
    3 に答える
    566 参照

    c - フレームポインタが削除されていないことを確認するためのgccマクロはありますか?

    -fomit-frame-pointerが使用されている場合(さまざまな-O設定に対して自動)、バックトレースの実行には問題があります。コードがこのスイッチでコンパイルされていることをコンパイル時に判断する方法があるかどうか疑問に思っていますか?その場合、アドバイスが不十分な場合にバックトレースを防ぐために#ifndefを入れることができます。

    この-fomit-frame-pointerスイッチがオンのときにマクロが設定されていますか?

    ありがとう、

    SetJmp

    0 投票する
    1 に答える
    572 参照

    gdb - gdb 6.3 で複数のスタックを切り替える

    プログラムには 2 つのスタックがあります。1 つは OS によって作成され、2 つ目はコードを実行するためにプログラム自体によって作成されます。

    2 番目のスタックでプログラムがクラッシュした場合、gdb のメイン スタックに切り替えて、バックトレースを確認したいと考えています。出来ますか?

    rsp を変数に保存し、クラッシュ後に変更しようとしましたが、結果のバックトレースは正しくありませんでした。gdb はスタック内のフレームを区別できないと思います。

    0 投票する
    1 に答える
    322 参照

    c++ - MacでBackTrace呼び出しを使用する場所

    クラッシュしたC++MacアプリケーションからBackTraceを取得したいのですが、Macを初めて使用するため、最善の方法がわかりません。

    私はその使用法を詳述するstackoverflowに関する質問を見つけました:macosxで現在のスタックトレースを取得する

    しかし、私の問題は、コードがどこにあるのかわからないということです。

    1. main.cppに含まれていますか?
    2. それはtrycatchブロックのcatch部分にありますか?

    私はいくつかの完全なコード例で行うことができましたが、それらを見つけるのに問題があります。