概 述
服務(wù)端程序不可避免的會使用gdb來調(diào)試程序,有關(guān)gdb調(diào)試的基礎(chǔ)內(nèi)容,可以參考Linux gdb調(diào)試。本文介紹使用gdb調(diào)試多進(jìn)程程序和多線程程序
gdb 調(diào)試多進(jìn)程程序
1. 單獨調(diào)試子進(jìn)程
單獨調(diào)試子進(jìn)程比較簡單,通過目標(biāo)子進(jìn)程的PID,attach到gdb調(diào)試器上。
2. 使用調(diào)試器選項
gdb提供follow-fork-mode選項,在程序執(zhí)行到fork系統(tǒng)調(diào)用時,允許我們選擇繼續(xù)調(diào)試父進(jìn)程還是子進(jìn)程,用法如下:
(gdb) set follow-fork-mode mode
mode可選值如下:
-
parent:表示調(diào)試父進(jìn)程 -
child:表示調(diào)試子進(jìn)程
gdb 調(diào)試多線程程序
gdb提供了一組命令用于輔助多線程程序的調(diào)試,這里列舉常用的:
info threads
用于顯示可調(diào)式的所有線程。gdb會為每個線程分配一個ID,我們可以使用這個ID來操作對應(yīng)的線程。ID前帶有 * 號的線程是當(dāng)前被調(diào)試的線程。
thread ID
用于調(diào)試目標(biāo)ID指定的線程。
set scheduler-locking [ off|on|step ]
用于設(shè)置其他線程的執(zhí)行情況,可選值如下:
-
off:表示不鎖定任何線程,即所有線程都繼續(xù)執(zhí)行。默認(rèn)值 -
on:表示只有當(dāng)前被調(diào)試的線程會繼續(xù)執(zhí)行 -
step:表示在單步執(zhí)行時,只有當(dāng)前被調(diào)試的線程會執(zhí)行