91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Linux如何使用gdb調試多進程

發布時間:2022-01-27 14:32:04 來源:億速云 閱讀:253 作者:iii 欄目:開發技術

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

一.gdb常用目錄表

操作描述
l命令相當于list,從第一行開始列出源碼
回車重復上一次命令
break +行號設置斷點
break+函數名在函數的入口點設置斷點
r運行程序running的簡寫
into break查看斷點信息
n單語句執行 ,next的簡寫
c繼續運行程序,continue的簡寫
bt查看函數的堆棧
finish退出函數
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

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

parenton只調試主進程(此程序中系統默認只調試parent)
childon只調試子進程
parentoff同時調試兩個進程,gdb跟主進程。子進程block(阻塞)在fork位置
childoff同時調試兩個進程,gdb跟子進程,主進程block在fork位置

設置方法如下圖:show follow-fork-mode show detach-on-fork Linux如何使用gdb調試多進程

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

Linux如何使用gdb調試多進程

  • 添加新的調試進程: add-inferior [-copies n] [-exec executable] ,可以用file executable來分配給inferior可執行文件。 增加n個inferior并執行程序為executable。如果不指定n只增加一個inferior。如果不指定executable,則執行程序留空,增加后可使用file命令重新指定執行程序。這時候創建的inferior其關聯的進程并沒啟動。

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

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

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

三.多線程調試

多線程代碼

 #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

注意:在創建線程時候,在編譯鏈接的時候一定要加-lpthread!!!一定要加-lpthread!!!一定要加-lpthread!!!! 重要的事情說三遍,慘痛的教訓 運行圖 Linux如何使用gdb調試多進程

在多線程編程時,當我們需要調試時,有時需要控制某些線程停在斷點,有些線程繼續執行。有時需要控制線程的運行順序。有時需要中斷某個線程,切換到其他線程。這些都可以通過gdb實現。 GDB默認支持調試多線程,跟主線程,子線程block在create thread。 多線程編程常用目錄表

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

四.關于core

core的意思是核心,dumped的意思就是拋出,轉儲,core dumped就是核心轉儲的意思。當一個進程異常退出前,該進程會拋出當時該程序進程的內存詳細情況存儲在硬盤上,文件名通常是core,這就叫core dump。

進程異常終止通常是因為代碼存在BUG,比如非法內存訪問導致段錯誤,事后可以用調試器檢查core文件以查清錯誤原因,這叫做事后調試.

關于core的指令:

指令描述
uname -a查看機器參數
ulimit -a查看默認參數
ulimit -c 1024設置core文件大小為1024
ulimit -c unlimit設置core文件大小為無限

修改ulimit的設置,讓它產生。

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

關于“Linux如何使用gdb調試多進程”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Linux如何使用gdb調試多進程”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建瓯市| 上栗县| 桑植县| 五大连池市| 康乐县| 册亨县| 寿宁县| 太湖县| 辛集市| 育儿| 临澧县| 建湖县| 大新县| 科技| 濮阳县| 迭部县| 长海县| 衡东县| 青川县| 金昌市| 常山县| 龙江县| 永新县| 绥化市| 苏尼特右旗| 新泰市| 寿宁县| 招远市| 阿拉善盟| 浦江县| 威宁| 九寨沟县| 宾阳县| 肥西县| 民丰县| 三亚市| 乐安县| 桃园市| 定陶县| 昌宁县| 涟水县|