問題タブ [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.
c++ - 共有ライブラリ内のバックトレース関数
SEGSEGV
共有ライブラリに入った後、スタック トレースを取得してファイルに保存しようとしています。共有ライブラリは、クローズド ソース製品のプラグインです。これはすべて本番環境で機能し、直接アクセスすることはできません。
私のコードはシグナルをキャッチしSIGSEGV
、スタックトレースを出力して終了します。私はこのようなものを持っています:
/opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/ libexec/site/ec_attachextensions.so [0x2aecc201a587]
/opt/ecelerity/sbin/ecelerity [0x501235]
/opt/ecelerity/sbin/ecelerity(sieve_seng_execute+0x82) [0x506d32] /opt/ecelerity/libexec/validate/sieve.so [0x2aecc2862c9e] /opt/ecelerity/sbin/ecelerity(validate_data+0xa5) [0x4a90d5] /opt/ ecelerity/sbin/ecelerity(esmtp_message_factory+0x154e) [0x46eace] /opt/ecelerity/sbin/ecelerity(schedule_event_and_dispatch+0x6a) [0x49c59a]
問題は、共有ライブラリの関数名とオフセットを内部に持つことができないことです。私が理解しているように、でライブラリオフセットを見つけた後、 addr2line ユーティリティを使用して、特定のアドレスの関数名/ファイル名を見つけることができます/proc/$PID/maps
。
その後、私はそのようなことを実行しています:
0x2aecc2019f11
上記のスタック トレースのアドレスはどこにありますか。マップファイルに触れずにスタックトレースで関数名を取得する方法はありますか? 言い換えれば、どのようにプログラムできますか?dladdr
ここで役立ちますか(私の場合、関数dladdr
によって提供されるアドレスから関数名を取得できませんbacktrace
)?
linux - d2:バックトレース情報を取得していません
gtkdラッパージェネレーターで遊んでいて、std.conv例外が発生しましたが、シンボリックデバッグ情報をまったく取得できません。私はデバッグシンボルでコンパイルしました:
ただし、バックトレースはメモリアドレスのリストにすぎません。
これは32ビットLinuxの下にあります
c++ - snprintf での strlen の呼び出し中に backtrace_symbols_fd() の呼び出しがハングすることがある
シグナル ハンドラーで障害をキャッチし、スタック トレース情報を出力してログ ファイル (またはコンソール) に追加し、クラッシュ レポートを作成して、非開発マシンでアプリケーションをデバッグしようとしています。私の問題は、完全なスタック フレームのバックトレースが得られない場合があることです。多くの場合、ハングして終了または終了しないように見えます。正常に終了することがあります。
これが私のコードです:
サンプル コードで、sigaction を呼び出し元のアドレスで上書きするセクションがコメント アウトされていることに気付くでしょう。これは、Mac 用にコンパイルする方法がわからないためです。
コンソール出力の例を次に示します。 コンソール出力 http://www.minesclubtennis.com/images/stackoverflow/fatalconsoleoutputhang.png
最初の 3 フレームしか印刷されず、9 フレームが検出され、印刷されるはずだったにもかかわらず、終了せずにハングしたことがわかります。
そのため、Activity Monitor アプリから「サンプル プロセス」を実行したところ、backtrace_symbols_fd 関数を実行するスレッドが strlen でスタックしていることがわかりました。スクリーンショット: プロセス出力のサンプル http://www.minesclubtennis.com/images/stackoverflow/sampleprocessoutputhang.png
なぜぶら下がっているのですか?これは自分のコードのバグですか、それとも Apple のbacktrace内のバグですか? シグナルハンドラーでできることは限られていると言われましたが、sigaction のマニュアルページには、私が間違っていることを示すものは何もありません。
c++ - libcを使用したSIGSEGVバックトレースがエントリを繰り返しています
利用可能なexecinfoバックトレースに移動する前にlibunwindを使用していました。新しいバックトレースを実装した後、プロジェクトからlibunwindを削除して完全に再構築するまで、楽しんでいました。
現在、私のバックトレース関数はSIGSEGVから通常の結果を生成することを拒否しています(そこからバックトレースを実行するのは安全ではないことを私は知っています)が、なぜ以前は正常に機能していたのですか?
間違った結果で今のところ出力を投稿します。最初のバックトレースは例外であり、2番目の意図的なSIGSEGV-期待される結果は__libc_start_mainへのトレースになります
シグナルスタッキングについて何か問題として読んだことを覚えていますか?
c - Cygwinで有用なバックトレースを取得するにはどうすればよいですか?
Cプログラムをでコンパイルしました-g -O0
が、gdbから取得したバックトレースは役に立ちません。
Cygwinで有用なバックトレースを取得する方法はありますか?
私のgdbバージョンは7.3.50.20111026-cvs (cygwin-special)
、gccは4.5.3
です。
crash - erlang のエラー バックトレースを誰が説明できますか?
- シェルできれいなエラートレースを出力する良い方法はありますか?
- エラートレースを理解する方法は?
ありがとう!
c++ - C++の不要なアボートの原因は?
C++ コードに非常に奇妙なバグがあります。
全体を理解するために話をしなければなりません。boost_thread ライブラリ経由でスレッドを使用しています。メイン メソッドはいくつかの初期化を行い、3 ~ 4 スレッドを開始してから、永久に待機します。
すべてのスレッドのメイン関数には、いくつかの catch と catch all ハンドラーを使用した try があります。
スレッドは次のようなさまざまなタスクを実行します
- execv 関数でスクリプトを実行し、
- sqlite ライブラリを使用してデータベースに書き込み、
- openssl ライブラリを介して世界と通信します。
通常ではありませんが、非常に頻繁に、プログラムが終了してしまうことがあります。
すべてが適切に解放され、必要なときに削除されるため、これが問題になることはありません。問題をデバッグする機会を得るために、コア ダンプを生成するようにしました。
ここで興味深いのは、GDB のバックトレースが次のようになっていることです。
エンドレスのアボート コール。原因がわかりません。スレッドは次のようになります。
スレッド 1 が無限のスリープ ループを持つメイン関数であるため、これも興味深いものです。
私の質問: どうすれば中絶の理由を知ることができますか?
フォーラム、IRC チャンネル、Google で検索していますが、それでも何もありません。私はこの数週間前に立ち往生したので、どんな情報でも大歓迎です!
どうもありがとうございました!
c - GDB からスタック トレースを取得する
スタック、または関数の呼び出し方法を誤解しているに違いありません。GDB から取得したバックトレースの結果は意味がありません。コンポーネントを追加できるように、プログラム内で呼び出される場所を見つけようとしています。
このツールは動画にバウンディング ボックスを描画します。私が作成したのはインターポレーターです。ボックスが描画されているときに GDB を開いてブレークポイントを設定し、バックトレースを実行することだけが理にかなっていると思いました。これがmuの出力です(からプログラムを実行した後ffmpeg.c main()
)
すべての非ASCII文字を無視して、2つの関数はどのようdraw_glyphs
にdraw_text
呼び出されていますか? スタックに他に何もないのはなぜですか?Frame #1 を選択して try and go を実行すると、次のようup
に表示されます。
編集:
私はもっと調べましたが、尋ねたときよりもさらに混乱しています。関数draw_glyphs
は、私が実行しているメインの内部でも呼び出されません。これがコンパイルに使用するすべてのファイルを調べましたが、まあ...どこにも呼び出されていません!
これは動的に作成された関数ポインタか何かということですか? もしそうなら、それは私のようにスタックにアクセスできないようにしますか?
linux - gdb:fglrx_dri.so segfaultsのときに完全なバックトレースを取得する方法は?
独自のQtベースのOpenGLアプリケーションを実行しているときに、fglrxdriライブラリでセグメンテーション違反が発生しています。gdbから取得したバックトレース(Qtおよび自分のアプリケーション用にインストールされたdbgシンボルを使用):
コードから、セグメンテーション違反の原因となるfglrx関数をどこで呼び出すかがわかりません。このバックトレースを拡張して、main()関数からfglrx driライブラリまで完全に表示するにはどうすればよいですか?
編集:自分のアプリケーションがデバッグシンボルで構築されていることを確認するには:
c - ゾンビ、gdb がアタッチできない、最後の呼び出しまたはバックトレースを確認する方法
アプリケーションが Linux ボックスでゾンビ状態になり、強制終了できず、gdb をアタッチできず、デバッグできません。今、最後に呼び出された関数またはバックトレースを知りたいのですが、とにかくこれを取得できますか? これに使用できる /proc/pid/stat の下の情報はありますか?