溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux如何使用gdb調(diào)試多進(jìn)程

發(fā)布時間:2022-01-27 14:32:04 來源:億速云 閱讀:246 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Linux如何使用gdb調(diào)試多進(jìn)程的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Linux如何使用gdb調(diào)試多進(jìn)程文章都會有所收獲,下面我們一起來看看吧。

一.gdb常用目錄表

操作描述
l命令相當(dāng)于list,從第一行開始列出源碼
回車重復(fù)上一次命令
break +行號設(shè)置斷點(diǎn)
break+函數(shù)名在函數(shù)的入口點(diǎn)設(shè)置斷點(diǎn)
r運(yùn)行程序running的簡寫
into break查看斷點(diǎn)信息
n單語句執(zhí)行 ,next的簡寫
c繼續(xù)運(yùn)行程序,continue的簡寫
bt查看函數(shù)的堆棧
finish退出函數(shù)
q退出gdb

二.多進(jìn)程調(diào)試

測試代碼:

 #include #include #include   int main() {     pid_t id = fork();     if(id == 0)//child     {         printf("I am child ,my id is:%d;my father id is:%d \n",getpid(),getppid());     }     else if(id > 0)//parent     {         sleep(2);         printf("I am father:%d \n",getpid());     }     else     {         perror("fork error");         return -1;     }     return 0; } 12345678910111213141516171819202122232425

默認(rèn)設(shè)置下,在調(diào)試多進(jìn)程程序時GDB只會調(diào)試主進(jìn)程。但是GDB(>V7.0)支持多進(jìn)程的分別以及同時調(diào)試,換句話說,GDB可以同時調(diào)試多個程序。只需要設(shè)置follow-fork-mode(默認(rèn)值:parent)和detach-on-fork(默認(rèn)值:on)即可。

parenton只調(diào)試主進(jìn)程(此程序中系統(tǒng)默認(rèn)只調(diào)試parent)
childon只調(diào)試子進(jìn)程
parentoff同時調(diào)試兩個進(jìn)程,gdb跟主進(jìn)程。子進(jìn)程block(阻塞)在fork位置
childoff同時調(diào)試兩個進(jìn)程,gdb跟子進(jìn)程,主進(jìn)程block在fork位置

設(shè)置方法如下圖:show follow-fork-mode show detach-on-fork Linux如何使用gdb調(diào)試多進(jìn)程

  • 查詢正在調(diào)試的進(jìn)程:info inferiors 顯示GDB調(diào)試的所有inferior,GDB會為他們分配ID。其中帶有*的進(jìn)程是正在調(diào)試的inferior. ( GDB將每一個被調(diào)試程序的執(zhí)行狀態(tài)記錄在一個名為inferior的結(jié)構(gòu)中。一般情況下一個inferior對應(yīng)一個進(jìn)程,每個不同的inferior有不同的地址空間。inferior有時候會在進(jìn)程沒有啟動的時候就存在。) 切換調(diào)試的進(jìn)程: inferior 切換到ID是num的inferior進(jìn)行調(diào)試。

Linux如何使用gdb調(diào)試多進(jìn)程

  • 添加新的調(diào)試進(jìn)程: add-inferior [-copies n] [-exec executable] ,可以用file executable來分配給inferior可執(zhí)行文件。 增加n個inferior并執(zhí)行程序?yàn)閑xecutable。如果不指定n只增加一個inferior。如果不指定executable,則執(zhí)行程序留空,增加后可使用file命令重新指定執(zhí)行程序。這時候創(chuàng)建的inferior其關(guān)聯(lián)的進(jìn)程并沒啟動。

  • remove-inferiors infno: 刪除一個infno號的inferior。如果inferior正在運(yùn)行,則不能刪除,所以刪除前需要先kill或者detach這個inferior。

  • detach inferior: detach掉編號是infno的inferior。注意這個inferior還存在,可以再次用run命令執(zhí)行它

  • kill inferior infno: kill掉infno號inferior。注意這個inferior仍然存在,可以再次用run等命令執(zhí)行它。

三.多線程調(diào)試

多線程代碼

 #include #include  void* start_routine1() {     printf("I am a thread1 ,my tid is:%u\n",pthread_self());     return NULL; } void* start_routine2() {     printf("I am a thread1 ,my tid is:%u\n",pthread_self());     return NULL; } int main() {     pthread_t tid1;     pthread_t tid2;     pthread_create(&tid1,NULL, start_routine1, NULL);     pthread_create(&tid2,NULL, start_routine2, NULL);      pthread_join(tid1,NULL);     pthread_join(tid2,NULL);     return 0; }123456789101112131415161718192021222324

注意:在創(chuàng)建線程時候,在編譯鏈接的時候一定要加-lpthread!!!一定要加-lpthread!!!一定要加-lpthread!!!! 重要的事情說三遍,慘痛的教訓(xùn) 運(yùn)行圖 Linux如何使用gdb調(diào)試多進(jìn)程

在多線程編程時,當(dāng)我們需要調(diào)試時,有時需要控制某些線程停在斷點(diǎn),有些線程繼續(xù)執(zhí)行。有時需要控制線程的運(yùn)行順序。有時需要中斷某個線程,切換到其他線程。這些都可以通過gdb實(shí)現(xiàn)。 GDB默認(rèn)支持調(diào)試多線程,跟主線程,子線程block在create thread。 多線程編程常用目錄表

操作描述
info threads顯示當(dāng)前可調(diào)試的所有線程,每個線程會有一個GDB為其分配的ID,后面操作線程的時候會用到這個ID。 前面有*的是當(dāng)前調(diào)試的線程。
thread ID切換當(dāng)前調(diào)試的線程為指定ID的線程
break FileName.cpp:LinuNum thread all所有線程都在文件FileName.cpp的第LineNum行有斷點(diǎn)
thread apply ID1 ID2 command讓一個或者多個線程執(zhí)行GDB命令command
thread apply all command讓所有被調(diào)試線程執(zhí)行GDB命令command
set scheduler-locking off/on/step在調(diào)式某一個線程時,其他線程是否執(zhí)行。off,不鎖定任何線程,默認(rèn)值。on,鎖定其他線程,只有當(dāng)前線程執(zhí)行。step,在step(單步)時,只有被調(diào)試線程運(yùn)行。
set non-stop on/off當(dāng)調(diào)式一個線程時,其他線程是否運(yùn)行
set pagination on/off在使用backtrace時,在分頁時是否停止
set target-async on/ff同步和異步。同步,gdb在輸出提示符之前等待程序報(bào)告一些線程已經(jīng)終止的信息。而異步的則是直接返回

四.關(guān)于core

core的意思是核心,dumped的意思就是拋出,轉(zhuǎn)儲,core dumped就是核心轉(zhuǎn)儲的意思。當(dāng)一個進(jìn)程異常退出前,該進(jìn)程會拋出當(dāng)時該程序進(jìn)程的內(nèi)存詳細(xì)情況存儲在硬盤上,文件名通常是core,這就叫core dump。

進(jìn)程異常終止通常是因?yàn)榇a存在BUG,比如非法內(nèi)存訪問導(dǎo)致段錯誤,事后可以用調(diào)試器檢查core文件以查清錯誤原因,這叫做事后調(diào)試.

關(guān)于core的指令:

指令描述
uname -a查看機(jī)器參數(shù)
ulimit -a查看默認(rèn)參數(shù)
ulimit -c 1024設(shè)置core文件大小為1024
ulimit -c unlimit設(shè)置core文件大小為無限

修改ulimit的設(shè)置,讓它產(chǎn)生。

指令描述
ulimit -c 1024設(shè)置core文件大小為1024。要是core文件大于1024個塊,就產(chǎn)生不出來了。
ulimit -c unlimit設(shè)置core文件大小為無限

關(guān)于“Linux如何使用gdb調(diào)試多進(jìn)程”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Linux如何使用gdb調(diào)試多進(jìn)程”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI