[英]Is it possible to use addr2line with application compiled with release optimization arguments?
所以我有回溯
Exit with signal 11 at 2013-12-28_14:28:58.000000
/opt/s3ds/App(_Z7handlers+0x52) [0x5de322]
/lib/libc.so.6(+0x32230) [0x7f6ab9b3a230]
/opt/s3ds/App(_ZN17Service17Controller5frameERKf+0x505) [0x5a6b85]
/opt/s3ds/App(_ZN17Service15Cloud10updateEf+0x1de) [0x58642e]
/opt/s3ds/App(_ZN17Manager6updateEf+0x21b) [0x59194b]
/opt/s3ds/App(_ZN7Manager3runEv+0xd2) [0x604fa2]
/opt/s3ds/App() [0x62bfea]
/lib/libpthread.so.0(+0x68ca) [0x7f6abb0048ca]
/lib/libc.so.6(clone+0x6d) [0x7f6ab9bd7b6d]
我用以下參數編譯了應用程序:
-std=c++11 -fpermissive -m64 -g -rdynamic -mtune=native -flto -O3
因此,這是一個發布版本,其中包含一些最少的調試信息。
我想知道是否可以使用addr2line從這種優化的構建中獲取任何行號?
我嘗試了此處顯示的示例,但得到了??:0
:
$ addr2line -e ./App 0x62bfea
??:0
用於[]
所有地址。 我知道從Service::Controller::frame
到Manager::run
跟蹤中的功能(甚至可能是lambda /opt/s3ds/App() [0x62bfea]
)應在我的應用程序代碼中(不在某些庫中) )。
那么是否有可能獲得生產優化代碼的行號? 要獲取它們,還需要其他編譯器指令嗎?
我不確定。 通常,當函數是您自己的代碼的一部分時, rdynamic
開關應該就足夠了(在您的示例中似乎是這種情況)
您是否嘗試過使用-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls
進行編譯? 在分析優化程序時,此功能很有用。 也許它也可以幫助您解決問題。
(旁注:使用-C
開關調用addr2line
激活拆線,建議您使用此方式,因為使用的是C ++。)
可能是可能的,但可能並不足夠。
您必須了解, 優化的真正目的是更改代碼以使其更好(按某種度量標准)。 變更意味着最終的代碼可能不會在之后有意義地映射到源代碼。
一些例子:
當然,這些是功能的局部功能,您還必須考慮到
畢竟,嘗試並根據源代碼進行推理甚至有意義嗎? 不,不是。 當然,我什至沒有考慮所有這些轉換都發生在中間表示上的事實,並且最終的匯編代碼發布將使事情更加混亂(強度降低,是的!)。
老實說,即使addr2line
給了你幾行,我也會懷疑它的結果...然后首先問點什么呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.