http://blog.csdn.net/zg_hover/article/details/3722798 2012
=常用操作=
*如何查看一個函數(shù)的定義
(gdb) list(l) functionname
*如何進入和跳出函數(shù)?
gdb> b(break) n #fun()所在的行
gdb> s(step) #進入函數(shù)
gdb> finish 或 return #跳出函數(shù)
*如何打印一個結(jié)構(gòu)或數(shù)組的值?
**打印結(jié)構(gòu)的值
gdb>print(p) *structname
**打印一個數(shù)組的len個值
gdb>p *arrayname@len
* gdb 如何調(diào)試多進程
** 使用attach 命令
1,新建一個臨時文件(內(nèi)容任意),在需要調(diào)試的代碼的地方加入一個調(diào)試小程序,如:
- debug();
- func();
- void
- debug(void)
- {
- for ( ; ; ) {
- if (access("temp", F_OK) < 0) //temp是本地的一個文件
- break;
- }
- }
2,把程序運行起來,用ps命令找到需要調(diào)試進程的進程號,如果是網(wǎng)絡(luò)程序,可以用命令netstat幫助查找
此時程序會停留在debug處.
3,把這子進程粘上來,在debug()的下一行打斷點,進行下面的操作:
gdb> attach pid
gdb>break(b) num //num 是debug()的下一行號
4, 現(xiàn)在可以把temp這個文件刪除了,然后輸入下面的命令:
gdb>continue(c)
現(xiàn)在程序停留在debug下面一行,你可以運行s,n等命令進行調(diào)試了.
小結(jié): 優(yōu)點: 該方法可以調(diào)試各種復(fù)雜的進程模型程序. 比較實用.
缺點: 需要添加一小段代碼.
**set follow-fork-mode child
使用該命令調(diào)試多進程程序時的步驟如下:
1, 啟動gdb,并執(zhí)行一下命令:
gdb>file runpro
//如果最后一個參數(shù)是parent那么在調(diào)用fork后,gdb會跟蹤parent進程,
//如果是child則跟蹤子進程,這樣你就可以先在需要調(diào)試的地方打上斷點了。
gdb>set follow-fork-mode child
gdb>break num //num 是子進程運行部分的行號
這樣程序就停在子進程的斷點處,現(xiàn)在可以調(diào)試子進程部分了.
** 在水木上看到一種方法,很好
(gdb)break fork
..
(gdb)run
..
(gdb)return 0
//這樣fork被認(rèn)為是返回0,就到子進程里面了
小結(jié): 缺點:如果有多個子進程的話,這種方法只能跟蹤其中的一個子進程.
優(yōu)點: 該方法比較簡單,不用添加額外的代碼.
*如何查看應(yīng)用程序中定義的宏
gcc -gdwarf-2 -g3 編譯就可以在gdb里面看macro定義
*
|