Mac上のQtにて開発しているのですが、スタック・トレースでハマっています。
boostのStackTraceでは関数名までしか表示されず、ソース・ファイル名と行番号が表示されません。addr2lineがないためと思います。
BOOST_STACKTRACE_USE_BACKTRACEを使ってlibbacktraceも試してみたのですがlibbacktrace.laのビルドがうまく行きません。(libbacktrace.laはできますが945バイトと小さくリンクしても_backtrace_create_state等のシンボル無しエラーになる)
Posixのbacktraceも大差ないです。(マングルされた関数名とオフセットが表示されます。)
アプリが落ちた後、システムが表示するダイアログで「レポート」を押すとソース・ファイルと行番号もでるので何らかの方法で表示することは可能と思うのですが、その方法を見つけることができません。
Mac上のC++プログラムでソース名と行番号を表示するには何をすればよいでしょうか?
もしくは、Mac(High Sierra 64bit)上でlibbacktraceをビルドする方法をご存知の方はいらっしゃいませんか?(現在は、単純に./configure後にmakeしているだけです。)
次に、SIGSEGV発生時のスタック・トレースも表示したく、boostのこのページの手順でトライしています。
しかし、Macの場合、起動する度にアプリがロードされるアドレスが変わるようで、前回保存したダンプ・ファイルの関数名さえ適切に表示されません。あさってのシンボルになったり、変換されなかったりです。これに対処する方法は存在するでしょうか?
Macについては不慣れなので、多少馬鹿なことを聞いているかも知れません。ご容赦頂けると幸いです。
【追記】
記載漏れがありました。binutilsのgaddr2lineは試しています。
homebrewでインストールし、インストールされたパスをBOOST_STACKTRACE_ADDR2LINE_LOCATIONでboost stack traceへ指示してみました。
結果は変わらず、関数名までしか表示されませんでした。
【更に追記】
Twitterで拾った情報からlibbacktraceのissue Mach-O support #2を辿れました。
どうも残念ながらlibbacktraceは未だMac OSはサポートしていない様子です。
英語のニュアンスがうまく読み取れないので、誤読しているかもしれませんが、需要が少ないことと苦労が凄まじいことが原因っぽいです。このプルリク主の JohnColanduoni さんはかなり粘り強く頑張っている(Add libbacktrace support for Apple platforms、Add libbacktrace support for Apple platforms (resubmitted))ようですが、結局難易度が高すぎていまだうまく行っていないと読み取れました。
Macはクローズド・システムだから、Appleがスタックトレースを取得するAPIを公開しない限りかなり厳しいことになります。そして、このように公開の場で苦労し続けている人がいるということは、Appleはスタックトレースを取得するAPIを公開していないということかも?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/21 03:12