簡體   English   中英

是否可以將addr2line與使用版本優化參數編譯的應用程序一起使用?

[英]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::frameManager::run跟蹤中的功能(甚至可能是lambda /opt/s3ds/App() [0x62bfea] )應在我的應用程序代碼中(不在某些庫中) )。

那么是否有可能獲得生產優化代碼的行號? 要獲取它們,還需要其他編譯器指令嗎?

我不確定。 通常,當函數是您自己的代碼的一部分時, rdynamic開關應該就足夠了(在您的示例中似乎是這種情況)

您是否嘗試過使用-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls進行編譯? 在分析優化程序時,此功能很有用。 也許它也可以幫助您解決問題。

(旁注:使用-C開關調用addr2line激活拆線,建議您使用此方式,因為使用的是C ++。)

可能是可能的,但可能並不足夠。

您必須了解, 優化的真正目的是更改代碼以使其更好(按某種度量標准)。 變更意味着最終的代碼可能不會在之后有意義地映射到源代碼。

一些例子:

  • 消除死代碼之類的方法將刪除現有代碼,這主要影響在給定源代碼行上放置斷點的嘗試,因為該行可能沒有代碼
  • 通用子表達式消除將突然創建新的臨時變量以僅計算一次子表達式; 這些子表達式最初可能出現在遍及源代碼的多個表達式中,因此新指令屬於多行...或根本沒有。
  • 與原始源代碼相比,不變的提升或循環循環將更改表達式的計算順序,以便您可能會看到在第3行,第6行,然后是4、5、7等執行的代碼。
  • 循環展開將多次復制/粘貼循環主體

當然,這些是功能的局部功能,您還必須考慮到

  • Function Inlining將在調用站點復制粘貼函數的主體
  • 函數合並將采用兩個不同的功能,並刪除其中一個,將其調用轉發給另一個(當然,因為它們具有相同的行為)

畢竟,嘗試並根據源代碼進行推理甚至有意義嗎? 不,不是。 當然,我什至沒有考慮所有這些轉換都發生在中間表示上的事實,並且最終的匯編代碼發布將使事情更加混亂(強度降低,是的!)。

老實說,即使addr2line給了你幾行,我也會懷疑它的結果...然后首先問點什么呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM