菜鳥的三年成長史

GDB與OBJDUMP

這幾天在看一個bug,關於bug的細節我就不贅述了,總之就是要從組語下手,。好極了!寫C的人其實都有這種覺悟,但組語指令集百百款並不是每個人都很熟悉每一款,尤其我天生不太會看MIPS(x86才是我的專門阿),總之就是這麼一個前情提要。

那麼這時候我都會用種偷懶的方法,利用objdump去展開組語然後用GDB去解析他,直接來個範例,以下是我隨便寫的 (一堆爛命名法請勿計較)

右邊是C code,file name: test.c,很標準的測試範例;左邊是我先用gcc -g -c test.c產生的test.o,記得一定要下"-g",接著用objdump -D test.o列出來的組語 (範例是x86)。

好!現在我想知道main+65對應到C code的哪行,怎麼辦?

土法煉鋼的做法是人肉組譯器,前提是你很熟指令集,但這實在很蠢。我用gdb test.o把他載入gdb後直接下(gdb) list *(main+65)結果如下圖

他甚麼都告訴你了,包括test.c:27,非常快,比人肉組譯器大概快個兩三萬倍吧!