2012年1月2日 星期一

debug info 和 optimization

要知道程式有沒有編進 debug info, 可用 objdump --source BINARY | less 觀察。若有看到程式碼的內容, 表示有編進去。另外要注意的是, 程式本身和用到的函式庫編法可能不同, 可能程式有加 -g, 但函式庫沒有。造成看得到一些函式內容, 卻看不到另一些的內容。

另一個要注意的點是, 今天聽 wens 說才知道編程式時可以同時用 -O-g。這樣做的好處是, 執行速度快, 接近 production 運作的情況。我自己試用的感覺是, 有些 bug 在 debug mode 可能不方便重制出來, 還有 debug mode 通常跑比較慢, 所以用 -O -g 還滿方便的。但不幸的是, 兩者合用會有一點副作用, 在 man gcc 裡有說明:

GCC allows you to use -g with -O. The shortcuts taken by optimized code may occasionally produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values were already at hand; some statements may execute in different places because they were moved out of loops.

Nevertheless it proves possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.

當程式是用 -O-g 編出來的時候, 用 objdump --source 會看到程式碼怪怪的, gdb 執行順序也會怪怪的, 執行行為和程式碼有時有一點出入, 還有部份的值會印不出來, gdb 輸出 value optimized out。若要觀察的東西就是那些部份, 就得回頭用 -O0 -g 確保沒有開啟最佳化。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...