您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux如何使用gdb調(diào)試多進(jìn)程的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Linux如何使用gdb調(diào)試多進(jìn)程文章都會有所收獲,下面我們一起來看看吧。
操作 | 描述 |
---|---|
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 |
測試代碼:
#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
parent | on | 只調(diào)試主進(jìn)程(此程序中系統(tǒng)默認(rèn)只調(diào)試parent) |
---|---|---|
child | on | 只調(diào)試子進(jìn)程 |
parent | off | 同時調(diào)試兩個進(jìn)程,gdb跟主進(jìn)程。子進(jìn)程block(阻塞)在fork位置 |
child | off | 同時調(diào)試兩個進(jìn)程,gdb跟子進(jìn)程,主進(jìn)程block在fork位置 |
設(shè)置方法如下圖:show follow-fork-mode show detach-on-fork
查詢正在調(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)試。
添加新的調(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í)行它。
多線程代碼
#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)行圖
在多線程編程時,當(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)終止的信息。而異步的則是直接返回 |
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è)資訊頻道。
免責(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)容。