Linux上で動作する64ビットマルチスレッドC++アプリケーションのシグナルハンドラからスタックトレースを出力する必要があります。いくつかのコード例が見つかりましたが、どれもコンパイルされません。私のブロッキングポイントは、ucontext_t構造体からの呼び出し元(シグナルが生成されたポイント)アドレスを取得しています。私が見つけることができるすべての情報は、ucontext.gregs [REG_EIP]またはucontext.eipとしてEIPレジスタを指しています。どちらもx86固有のものだと思われます。 IntelとAMD CPUの両方に64ビット準拠のコードが必要です。誰でも助けることができますか?シグナルハンドラからスタックトレースを出力する
答えて
スタックトレースを取得する通常の方法は、に使用される最適化オプション に依存している(そして コンパイラがコードを生成する方法に応じて、それにいくつかのマジックナンバーを追加し、ローカル 変数のアドレスを取ることですコードをコンパイルしてください)、そこから戻って作業してください。すべて非常にシステム に依存していますが、あなたが何をしているのか分かっていれば実行可能です。
これが信号ハンドラで動作するかどうかは別の問題です。私は あなたが記述するプラットフォームについては知っていませんが、多くのシステムは シグナルハンドラのための別のスタックをインストールし、ユーザーがアクセス可能なメモリには 割り込みスタックに戻りません。
中断されたスタックに戻るリンクがないことを意味しますか? –
@wood_brianユーザーがアクセス可能なメモリではありません。 (OSは明らかに何らかの形で情報を保持しています。) –
中断された静的を書きました。私はスタックの中断を意味すると思った。 –
glibc機能があります。バックトレースです。マニュアルページには、その呼び出しの例がリストされています。
#define SIZE 100
void myfunc3(void) {
int j, nptrs;
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
詳細はmanページを参照してください。
posixは動作することが保証されているいくつかのリエントラント関数しかリストしていないので、シグナルハンドラから実際に動作することが保証されているかどうかは分かりません。覚えておいてください:シグナルハンドラは、残りのプロセスがmalloc呼び出しの途中で正しく呼び出されることがあります。
私の推測は、これは通常動作しますが、時々失敗する可能性があります。デバッグにはこれで十分です。
- 1. 出力ウィンドウのスタックトレースを印刷する
- 2. スタックトレースの出力を減らすにはどうすればよいですか?
- 3. シグナルハンドラからOCamlでラップされたZeroMQコードを呼び出す
- 4. スケーリングglibcメモリ破損スタックトレース出力
- 5. Java - メソッドシグネチャでスタックトレースを出力できますか?
- 6. Javaスタックトレースのbash出力をLinuxのファイルに出力するにはどうすればよいですか?
- 7. ログファイルからJavaスタックトレースを抽出するツール
- 8. ミニダンプからスタックトレースを抽出する方法は?
- 9. Javaはスタックトレースを別の出力ストリームに送信します
- 10. スタックトレース上のパラメータの値を出力します
- 11. サーブレット例外スタックトレースの出力を非表示/処理します
- 12. javacriptスタックトレースからJavaの実際のスタックトレースを見つける
- 13. C#のスタックトレース情報を出力してください
- 14. Django:manage.pyはスタックトレースのエラーを出力しません
- 15. EUnitで例外スタックトレースを出力しません
- 16. Djangoのシグナルハンドラからセッションを取得する方法
- 17. logcatからスタックトレースを抽出できません
- 18. linuxはシグナルハンドラからのシステムコールを許可していますか?
- 19. iOS:OpenALからバッファに出力するピッチシフトとパイプ出力
- 20. OCamlでスタックトレースを出力するには-gを使用する必要がありますか?
- 21. perlデーモン内のシグナルハンドラから値を返します
- 22. ASP.NETからCSVに出力する
- 23. スレッドperlとシグナルハンドラ
- 24. Python:Django:シグナルハンドラとメインスレッド
- 25. sem_waitとシグナルハンドラ
- 26. Xcode:GDBとシグナルハンドラ
- 27. シグナルハンドラ内のaio_read
- 28. TVJSからのコンソール出力を見る
- 29. NetBeansの出力タブから入力を取得する方法
- 30. teradataからデータを引き出す/出力する
できない場合は、私には驚かないでしょう。あなたは32ビットでやってみましたか?また、どのディストロ? –
64ビットでは、レジスタはRIPです。それがどこかにあることは間違いありません。 –
Red Hat 4.1.2-50です。私たちは最大60GB以上の大きなメモリ領域を扱うので、32ビットアプリケーションにすることはできません。 – GMichael