問題タブ [libunwind]
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++ - スタック トレースでファイル名と行番号を取得するためのポータブル/標準準拠の方法はありますか?
さっき読んだ
gcc C++ アプリがクラッシュしたときにスタックトレースを生成する方法
これは今ではかなり古いものです(5年)。いくつかの回答は、スタックフレームごとに、関数の名前とオフセット(私が推測するスタック内)を取得できるソリューションを提案しています。しかし、私 (および他の人) が本当に必要としているのは、呼び出しが行われたソース ファイル名と行番号です (コードがデバッグ情報でコンパイルされていると仮定します)。これを行うglibcの一部にリンクされた回答の1つ(libSegfault;このディレクトリ内のファイルを参照- segfault.c
、、、)-したがって、backtracesyms.c
可能です。backtracesymsfd.c
私の質問は次のとおりです。
- この情報は、プラットフォームに依存しない方法で、または何らかの標準 (POSIX??) に準拠する方法で抽出できますか?
- libunwind がこれをサポートしないのはなぜですか? (ウェブサイトを調べた後、そうではないと思います)
- これは、コンパイラの C/C++ 標準ライブラリ (少なくとも C/C++ アプリの場合) に依存する必要がありますか?
ノート:
- バイナリにはデバッグ情報があると思われるかもしれません。したがって、C/C++ の場合は
-g
;でコンパイルされています。もちろん、適切なライブラリでは、デバッグ情報が利用可能かどうかを確認します。
c++ - ライブラリを Cmake プロジェクトに追加する
単に見つからないのかもしれませんが、自分のプロジェクトにコードを追加したいと思っています (ここにある libunwind http://www.nongnu.org/libunwind/download.html ) 。
このライブラリには CMakeLists が付属していません。 txt ファイルを含めようとすると、cmake はこの事実について文句を言います。現在、libunwind ディレクトリを外部コードに追加し、メインの CMakeLists.txt に参照を追加しただけです。
どんな入力でも素晴らしいでしょう。
c++ - Libunwind PC 値が addr2line で機能しない
リンクの例に従ってみようとしています: https://eli.thegreenplace.net/2015/programmatic-access-to-the-call-stack-in-c/
しかし、私はいくつかの問題に遭遇しました。libunwind を使用してバックトレース情報を出力するようなコードがあります。
test.cpp
このコードを実行すると、次のような出力が生成されます。つまり、プログラム カウンター値: (function_name+0xoffset)
上記のリンクで述べたように、関数名の左側にあるプログラム カウンターの値を addr2line に入力して、ファイル名と行番号の情報を取得できます。ただし、そうしようとするたびに(たとえば、関数 foo の場合):
objdump ファイルを調べたところ、関数 foo にデバッグ エントリがあることがわかりました。
DW_at_low_pc の値を addrline に入力すると、正しい出力が生成されます。
まず、libunwind によって返される PC 値が DW_AT_low_pc の値と異なるのはなぜですか?
libunwind が PC に対して正しくない値を返しているようですが、その場合、libunwind はどのようにして関数名を取得できますか?
addr2line またはその他のコマンド ライン ツールを使用してファイル名とファイル番号を取得できる、libunwind からの PC 値を指定する方法はありますか?
読んでくれてありがとう、私はそのちょっと長い質問を知っています。