1.前言
GDB是Linux下非常好用且強大的調試工具。GDB可以調試C、C++、Go、java、 objective-c、PHP等語言。對于一名Linux下工作的c/c++程序員,GDB是必不可少的工具
2.GDB使用幫助
GDB命令擁有較多內部命令。在gdb命令提示符
下輸入help
可以查看所有內部命令及使用說明
3.使用GDB前注意文件是否帶有調試信息
判斷文件是否帶有調試信息:要調試C/C++的程序,首先在編譯時,要使用gdb
調試程序,在使用gcc
編譯源代碼時必須加上-g
參數。保留調試信息,否則不能使用GDB進行調試。
當你有一個編譯好的二進制文件,你不確定是否帶有調試信息,這個時候你可以使用如下的命令驗證:
gdb 二進制文件名
如果沒有調試信息,則會出現該二進制文件地址(提示無調試信息):
Reading symbols from /home/ordinary/code/c++/test...(no debugging symbols found)...done.
如果有調試信息,則會出現二進制文件地址:
Reading symbols from /home/ordinary/code/c/test...done.
4.使用GDB
啟動gdbgdb <program>
:啟動gdb,并加載指定的可執行文件<program>gdb <program> <core>
:啟動gdb,并加載指定的可執行文件<program>和核心轉儲文件<core>,用于分析程序崩潰時的狀態gdb <program> <pid>
:啟動gdb,并加載指定的可執行文件<program>和進程號為<pid>的正在運行的進程,用于動態調試
退出gdb
quit或q
設置斷點break <location> 或 b <location>
:在指定的位置設置一個斷點,可以是函數名、文件名:行號、或者內存地址。例如:
break main:在main函數的開始處設置斷點break test.c:10:在test.c文件的第10行設置斷點break *0x80483f4:在地址0x80483f4處設置斷點
刪除指定編號的斷點
delete <number> 或 d <number>
查看斷點編號
info break或i b
禁用斷點
disable <number>
啟用斷點
enable <number>
list <行號或者函數名> 或 l <行號或者函數名>
調試階段查看代碼
run <arguments> 或 r <arguments>
運行或重新運行程序,并傳遞指定的參數。如果設置了斷點,程序會在遇到斷點時暫停,并顯示當前的源代碼和寄存器值。
next或n
F10執行當前行,并跳到下一行。如果當前行是一個函數調用,next會直接執行整個函數,并不進入函數內部
step或s
F11執行當前行,并跳到下一行。如果當前行是一個函數調用,step會進入函數內部,并停在第一行
continue或c
繼續執行程序,直到遇到下一個斷點或者程序結束
finish或f
運行所在函數后停下來
until
跳轉至指定行
print <expression> 或 p <expression>
打印某個變量或者表達式的值。可以使用任何合法的C語言表達式,包括宏、指針、結構體等
例如:
print x打印變量x的值print *p:打印指針p所指向的值。print foo(x):打印調用foo函數并傳遞x作為參數后的返回值。
常顯示某個變量的地址或者值
display
取消常顯示某個變量的地址或者值
undisplay <number>
修改某個變量或者表達式的值。可以使用任何合法的C語言表達式,包括宏、指針、結構體等
set <expression>
例如:
set x = 10:修改變量x的值為10。set *p = 20:修改指針p所指向的值為20。set foo(x) = 30:修改調用foo函數并傳遞x作為參數后的返回值為30。info registers或i r:顯示所有寄存器的值。