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. スタックトレース要素例外の出力
- 6. Java - メソッドシグネチャでスタックトレースを出力できますか?
- 7. Visual Studioコンソール出力でスタックトレースを作成する方法
- 8. Slf4j/logback - 別のファイルにスタックトレースを出力する
- 9. Spring Framework IDEAスタックトレースの出力を最小限にする
- 10. ミニダンプからスタックトレースを抽出する方法は?
- 11. ログファイルからJavaスタックトレースを抽出するツール
- 12. Javaスタックトレースのbash出力をLinuxのファイルに出力するにはどうすればよいですか?
- 13. javacriptスタックトレースからJavaの実際のスタックトレースを見つける
- 14. スタックトレース上のパラメータの値を出力します
- 15. Javaはスタックトレースを別の出力ストリームに送信します
- 16. サーブレット例外スタックトレースの出力を非表示/処理します
- 17. geantからスタックトレースを取得する
- 18. Django:manage.pyはスタックトレースのエラーを出力しません
- 19. C#のスタックトレース情報を出力してください
- 20. EUnitで例外スタックトレースを出力しません
- 21. ロガーがスタックトレースをspring mvcに出力しない
- 22. logcatからスタックトレースを抽出できません
- 23. Djangoのシグナルハンドラからセッションを取得する方法
- 24. linuxはシグナルハンドラからのシステムコールを許可していますか?
- 25. pause()シグナルハンドラ
- 26. 出力ファイルの出力をカスタムファイルからphpのshell_exec経由で出力する
- 27. 出力をSASのCMDからログ出力するには?
- 28. Windowsから出力されたオーディオをLinuxに出力する
- 29. Jenkins:スクリプトからのコンソール出力でハイパーリンク(HyperlinkNote)を出力する
- 30. C#複数のバッチファイルから同じ出力を出力する
できない場合は、私には驚かないでしょう。あなたは32ビットでやってみましたか?また、どのディストロ? –
64ビットでは、レジスタはRIPです。それがどこかにあることは間違いありません。 –
Red Hat 4.1.2-50です。私たちは最大60GB以上の大きなメモリ領域を扱うので、32ビットアプリケーションにすることはできません。 – GMichael