一、顯示源代碼
GDB 可以打印出所調(diào)試程序的源代碼,當(dāng)然,在程序編譯時(shí)一定要加上-g的參數(shù),把源程序信息編譯到執(zhí)行文件中。不然就看不到源程序了。當(dāng)程序停下來(lái)以后,GDB會(huì)報(bào)告程序停在了那個(gè)文件的第幾行上。你可以用list命令來(lái)打印程序的源代碼。還是來(lái)看一看查看源代碼的GDB命令吧。
list <linenum> 顯示程序第linenum行的周圍的源程序。
list <function> 顯示函數(shù)名為function的函數(shù)的源程序。
list 顯示當(dāng)前行后面的源程序。
list - 顯示當(dāng)前行前面的源程序。
一般是打印當(dāng)前行的上5行和下5行,如果顯示函數(shù)是是上2行下8行,默認(rèn)是10行,當(dāng)然,你也可以定制顯示的范圍,使用下面命令可以設(shè)置一次顯示源程序的行數(shù)。
set listsize <count> 設(shè)置一次顯示源代碼的行數(shù)。
show listsize 查看當(dāng)前listsize的設(shè)置。
list命令還有下面的用法:
list <first>, <last> 顯示從first行到last行之間的源代碼。
list , <last> 顯示從當(dāng)前行到last行之間的源代碼。
list + 往后顯示源代碼。
一般來(lái)說(shuō)在list后面可以跟以下這們的參數(shù):
<linenum> 行號(hào)。
<+offset> 當(dāng)前行號(hào)的正偏移量。
<-offset> 當(dāng)前行號(hào)的負(fù)偏移量。
<filename:linenum> 哪個(gè)文件的哪一行。
<function> 函數(shù)名。
<filename:function> 哪個(gè)文件中的哪個(gè)函數(shù)。
<*address> 程序運(yùn)行時(shí)的語(yǔ)句在內(nèi)存中的地址。
二、搜索源代碼
不僅如此,GDB還提供了源代碼搜索的命令:
forward-search <regexp>,search <regexp> 向前面搜索。
reverse-search <regexp> 全部搜索。
其中<regexp>是正則表達(dá)式,也主一個(gè)字符串的匹配模式,關(guān)于正則表達(dá)式,我就不在這里講了,還請(qǐng)各位查看相關(guān)資料。
三、指定源文件的路徑
某些時(shí)候,用-g編譯過(guò)后的執(zhí)行程序中只是包括了源文件的名字,沒(méi)有路徑名。GDB提供了可以讓你指定源文件的路徑的命令,以便GDB進(jìn)行搜索。
directory <dirname ... >,dir <dirname ... > 加一個(gè)源文件路徑到當(dāng)前路徑的前面。如果你要指定多個(gè)路徑,
UNIX下你可以使用“:”,Windows下你可以使用“;”分隔。
directory 清除所有的自定義的源文件搜索路徑信息。
show directories 顯示定義了的源文件搜索路徑。
四、源代碼的內(nèi)存
你可以使用info line命令來(lái)查看源代碼在內(nèi)存中的地址。info line后面可以跟“行號(hào)”,“函數(shù)名”,“文件名:行號(hào)”,“文件名:函數(shù)名”,這個(gè)命令會(huì)打印出所指定的源碼在運(yùn)行時(shí)的內(nèi)存地址,如:
(gdb) info line tst.c:func
Line 5 of "tst.c" starts at address 0x8048456 <func+6> and ends at 0x804845d <func+13>.
還有一個(gè)命令(disassemble)你可以查看源程序的當(dāng)前執(zhí)行時(shí)的機(jī)器碼,這個(gè)命令會(huì)把目前內(nèi)存中的指令dump出來(lái)。如下面的示例表示查看函數(shù)func的匯編代碼。
(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>: push %ebp
0x8048451 <func+1>: mov %esp,%ebp
0x8048453 <func+3>: sub $0x18,%esp
0x8048456 <func+6>: movl $0x0,0xfffffffc(%ebp)
0x804845d <func+13>: movl $0x1,0xfffffff8(%ebp)
0x8048464 <func+20>: mov 0xfffffff8(%ebp),%eax
0x8048467 <func+23>: cmp 0x8(%ebp),%eax
0x804846a <func+26>: jle 0x8048470 <func+32>
0x804846c <func+28>: jmp 0x8048480 <func+48>
0x804846e <func+30>: mov %esi,%esi
0x8048470 <func+32>: mov 0xfffffff8(%ebp),%eax
0x8048473 <func+35>: add %eax,0xfffffffc(%ebp)
0x8048476 <func+38>: incl 0xfffffff8(%ebp)
0x8048479 <func+41>: jmp 0x8048464 <func+20>
0x804847b <func+43>: nop
0x804847c <func+44>: lea 0x0(%esi,1),%esi
0x8048480 <func+48>: mov 0xfffffffc(%ebp),%edx
0x8048483 <func+51>: mov %edx,%eax
0x8048485 <func+53>: jmp 0x8048487 <func+55>
0x8048487 <func+55>: mov %ebp,%esp
0x8048489 <func+57>: pop %ebp
0x804848a <func+58>: ret
End of assembler dump.