GDB抓蟲之旅(上篇)

2021-09-25 13:27:10 字數 4322 閱讀 3362

問: gdb是什麼?

答: 強大的unix下命令列除錯工具。

問: gdb能幹什麼?

答: 讓你隨心所欲的駕馭你的程式;start、stop、examine、change。

問: 我們為什麼要學習gdb?

答: 欲善其事,必先利其器;利用gdb進一步的定位程式異常。

問: 本次分享的宗旨?

答: gdb的介紹和使用入門,為大家抓蟲多提供乙個選擇。

前期準備
1.包含有除錯資訊的可執行檔案

2.編譯時加-g選項即可,不建議開優化選項

gdb的啟動
gdb gdb coregdb (gdb) file
抓蟲流程

實戰1 :  gdb基礎命令的使用

1.1、示例程式(example_1.cpp)

#include #include using namespace std;int foo(int m, int n)int foo(int n)    return result;

}int main()

cout<

1.2、除錯準備 編譯命令:g++ -g -wall -o example_1 example_1.cpp

1.3、啟動gdb

$ gdb example_1

gnu gdb red hat linux (6.3.0.0-1.96rh)

gdb is free software, covered by the gnu general public license, and you are

welcome to change it and/or distribute copies of it under certain conditions.

type "show copying" to see the conditions.

there is absolutely no warranty for gdb.  type "show warranty" for details.

this gdb was configured as "x86_64-redhat-linux-gnu"...using host libthread_db library "/lib64/tls/libthread_db.so.1".

1.4、輔助性命令

(gdb) cd ..

working directory /home/work/testers/sgc.

(gdb) shell ls

autotest  client  makefile  spanti  spantispam_if.h  study(gdb) cd study/

working directory /home/work/testers/sgc/study.

(gdb) pwd

working directory /home/work/testers/sgc/study.

(gdb) help run

start debugged program.  you may specify arguments to give it.

args may include "*", or "[...]"; they are expanded using "sh".

input and output redirection with ">", ">" are also allowed.

with no arguments, uses arguments last specified (with "run" or "set args").

to cancel previous arguments and run with no arguments,use "set args" without arguments.

1.5、設定斷點命令

//檢視源**資訊(gdb) l17                      result+=n;18              }19              return result;2021      }2223      int main()24      12      int foo(int n)13      19              return result;20(gdb) l foo(int)8

9               return 1;1011      }12      int foo(int n)13      int main()

2.2、檢視資訊

gdb is free software, covered by the gnu general public license, and you are

welcome to change it and/or distribute copies of it under certain conditions.

type "show copying" to see the conditions.

there is absolutely no warranty for gdb.  type "show warranty" for details.

this gdb was configured as "x86_64-redhat-linux-gnu"...using host libthread_db library "/lib64/tls/libthread_db.so.1".

core was generated by `./crash2'.

program terminated with signal 11, segmentation fault.

reading symbols from /lib64/tls/libc.so.6...done.

loaded symbols for /lib64/tls/libc.so.6

reading symbols from /lib64/ld-linux-x86-64.so.2...done.

loaded symbols for /lib64/ld-linux-x86-64.so.2

#0  0x000000302af6f9a4 in strcpy () from /lib64/tls/libc.so.6(gdb) bt

#0  0x000000302af6f9a4 in strcpy () from /lib64/tls/libc.so.6

#1  0x00000000004004c5 in strcpy (to=0x0, from=0x4005dc "abcdefg") at crash2.c:5

#2  0x00000000004004e5 in main () at crash2.c:10(gdb) f 0

#0  0x000000302af6f9a4 in strcpy () from /lib64/tls/libc.so.6(gdb) up

#1  0x00000000004004c5 in strcpy (to=0x0, from=0x4005dc "abcdefg") at crash2.c:5

5                       strcpy(to , from);

(gdb) info args

to = 0x0from = 0x4005dc "abcdefg"//至此,已經清楚的發現了問題所在,to指標為空多執行緒除錯常用命令

$ info <...>  // 強大的檢視命令,如info threads

$ attach/detach // 掛載到程序

$ thread // 切換到執行緒

$ break thread if ...

實戰3 :  多執行緒程式除錯

3.1、正常的示例程式(good_thread.c)

#include #include #include #include #define max 10pthread_t thread[2];

pthread_mutex_t mut;int number=0, i;void *thread1()

printf("thread1 :主函式在等我完成任務嗎?\n");

pthread_exit(null);

}void *thread2()

printf("thread2 :主函式在等我完成任務嗎?\n");

pthread_exit(null);

}void thread_create(void)

void thread_wait(void)

if(thread[1] !=0) 

}int main()

網易雲免費體驗館,0成本體驗20+款雲產品!

GDB抓蟲之旅(上篇)

問 gdb是什麼?答 強大的unix下命令列除錯工具。問 gdb能幹什麼?答 讓你隨心所欲的駕馭你的程式 start stop examine change。問 我們為什麼要學習gdb?答 欲善其事,必先利其器 利用gdb進一步的定位程式異常。問 本次分享的宗旨?答 gdb的介紹和使用入門,為大家抓...

江湖中傳說珊瑚蟲 到底應該抓誰?

江湖中傳說珊瑚蟲 到底應該抓誰?我本不想經受風吹浪打,無奈it江湖風高浪急,近日還是有幾滴浪花讓我看到了珊瑚蟲事件。事件本身已經有了當地公安機關的明確處理,並製作出了電視節目,但網上的議論此起彼伏,各執一詞,甚至有人發起對珊瑚蟲作者的聲援 我這裡就不去再講雙方孰是孰非了,我只單單談談我的思考。思考一...

抓蟲記之九 都是執行緒惹的禍

在發生的時候,沒有丟擲異常現象,這樣的bug是很難進行跟蹤的。你只有通過各種方向的分析,調查,才能慢慢的找到。這就好像,突然發現乙個屍體,你就得到失蹤人口裡去尋找,可是是否找得到,有時候可能就是運氣問題。幸好,軟體不是現實,我們可以反覆的進行除錯。同樣是上次案例的那個伺服器。有一段時間發現伺服器在自...