• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 > linux gdb調(diào)試基本命令

    linux gdb調(diào)試基本命令

    時(shí)間: 志藝942 分享

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      

    linux gdb調(diào)試基本命令

      近年來(lái),隨著嵌入式技術(shù)飛速發(fā)展,嵌入式產(chǎn)品隨處可見(jiàn),Linux的應(yīng)用也越來(lái)越廣泛。接下來(lái)是小編為大家收集的linux gdb調(diào)試基本命令,希望能幫到大家。

      linux gdb調(diào)試基本命令

      1.啟動(dòng)調(diào)試

      前置條件:編譯生成執(zhí)行碼時(shí)帶上 -g,如果使用Makefile,通過(guò)給CFLAGS指定-g選項(xiàng),否則調(diào)試時(shí)沒(méi)有符號(hào)信息。

      gdb program //最常用的用gdb啟動(dòng)程序,開(kāi)始調(diào)試的方式

      gdb program core //用gdb查看core dump文件,跟蹤程序core的原因

      gdb program pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      gdb attach pid //用gdb調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序,指定pid即可

      2.調(diào)試命令

      (1)執(zhí)行命令模式

      -batch選項(xiàng)。

      比如:打印$pid進(jìn)程所有線程的堆棧并退出。

      gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

      (2).交互模式

      run //運(yùn)行程序

      continue //中斷后繼續(xù)運(yùn)行到下一個(gè)斷點(diǎn)

      step //單步執(zhí)行,進(jìn)入函數(shù)

      next //單步執(zhí)行

      return //函數(shù)未執(zhí)行完,忽略未執(zhí)行的語(yǔ)句,返回。

      finish //函數(shù)執(zhí)行完畢返回。

      call //調(diào)用某一個(gè)函數(shù) fun("1234")

      (backtrace)bt //顯示棧楨

      bt N //顯示開(kāi)頭N個(gè)棧楨

      bt -N //顯示最后N個(gè)棧楨

      (frame)f N //顯示第N層棧楨

      list //顯示源碼

      set directory //設(shè)置gdb的工作目錄

      pwd //當(dāng)前的工作目錄

      (3)反復(fù)執(zhí)行

      continue N //連續(xù)執(zhí)行cointiue N次,一般用于避免頻繁斷點(diǎn)

      step N

      next N

      3.斷點(diǎn)

      break 函數(shù)名 //設(shè)置斷在某個(gè)函數(shù)

      break 文件名:行號(hào) //設(shè)置斷在某一行

      info break //查看設(shè)置的斷點(diǎn)信息

      break if condition //條件斷點(diǎn)

      break 函數(shù)名 thread 線程號(hào) //設(shè)置斷點(diǎn)只斷某個(gè)線程,通過(guò)info threads 查看線程號(hào)

      delete 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //刪除一個(gè)或多個(gè)斷點(diǎn)

      diable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //禁止一個(gè)或多個(gè)斷點(diǎn)

      enable 斷點(diǎn)號(hào) 斷點(diǎn)號(hào)... //打開(kāi)一個(gè)或多個(gè)斷點(diǎn)

      command 斷點(diǎn)號(hào) //斷點(diǎn)觸發(fā)時(shí),執(zhí)行命令,一般用于打印變量

      (gdb) command 1

      Type commands for breakpoint(s) 1, one per line.

      End with a line saying just "end".

      >print x

      >end

      (gdb)

      4.檢測(cè)點(diǎn)

      watch //為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。

      rwatch //當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。

      awatch //當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。

      info watchpoints //列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。

      經(jīng)驗(yàn):觀察某個(gè)變量是否變化,被讀或者被寫(xiě),由于變量只在某一個(gè)作用域,可以獲取變量的地址,然后觀察。

      比如:觀察examined_rows變量神馬時(shí)候被修改

      (1).p &examined_rows,得到地址

      (2).watch *(ha_rows *) 0x7ffec8005e28,則可以觀察這個(gè)變量的變化情況。

      5.查看變量

      (1)設(shè)置

      set print elements N //指定打印的長(zhǎng)度,對(duì)長(zhǎng)字符串特別有用。

      set print element 0 //輸出完整的字符串

      set print pretty //設(shè)置GDB打印結(jié)構(gòu)的時(shí)候,每行一個(gè)成員,并且有相應(yīng)的縮進(jìn),缺省是關(guān)閉的

      print {type} variable

      比如:

      (gdb) p {ABC} 0x7fffffffe710

      $2 = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    = {val = 1.5, val2 = 10}

      print xxx //打印變量

      p /x xxx //16進(jìn)制顯示

      p str@str_len //打印字符串

      info locals //打印出當(dāng)前函數(shù)中所有局部變量及其值。

      info args //打印出當(dāng)前函數(shù)的參數(shù)名及其值。

      display 變量 //自動(dòng)打印變量

      undisplay //取消自動(dòng)打印

      注意:默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的,編譯時(shí)候需要給選項(xiàng)。-g3

      6.內(nèi)存查看

      格式: x /nfu <addr> x 是 examine 的縮寫(xiě)

      a.n表示要顯示的內(nèi)存單元的個(gè)數(shù)

      b.f表示顯示方式, 可取如下值

      (1).x 按十六進(jìn)制格式顯示變量。

      (2).d 按十進(jìn)制格式顯示變量。

      (3).u 按十進(jìn)制格式顯示無(wú)符號(hào)整型。

      (4).o 按八進(jìn)制格式顯示變量。

      (5).t 按二進(jìn)制格式顯示變量。

      (6).a 按十六進(jìn)制格式顯示變量。

      (7).i 指令地址格式

      (8).c 按字符格式顯示變量。

      (9).f 按浮點(diǎn)數(shù)格式顯示變量。

      c.u表示一個(gè)地址單元的長(zhǎng)度

      (1).b表示單字節(jié),

      (2).h表示雙字節(jié),

      (3).w表示四字節(jié),

      (4).g表示八字節(jié)

      比如:x/3xh buf

      表示從內(nèi)存地址buf讀取內(nèi)容,3表示三個(gè)單位,x表示按十六進(jìn)制顯示,h表示以雙字節(jié)為一個(gè)單位。

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

      info threads //查看線程

      thread thread_no //切換到線程號(hào)

      thread apply all command //所有線程都執(zhí)行命令打印棧楨

      比如:thread apply all bt //所有線程都打印棧楨

      (1)線程鎖

      show scheduler-locking

      set scheduler-locking on

      set scheduler-locking off

      默認(rèn)是off,當(dāng)程序繼續(xù)運(yùn)行的時(shí)候如果有斷點(diǎn),那么就把所有的線程都停下來(lái),直到你指定某個(gè)線程繼續(xù)執(zhí)行(thread thread_no apply continue).

      但是如果直接在當(dāng)前線程執(zhí)行continue的話,默認(rèn)是會(huì)啟動(dòng)所有線程。這種模式有一種副作用,如果多個(gè)線程都斷在同一個(gè)函數(shù),這時(shí)候調(diào)試會(huì)出問(wèn)題。

      這個(gè)時(shí)候需要打開(kāi)線程鎖,但打開(kāi)線程鎖,意味著其它線程不能運(yùn)行了。

      (2)non-stop模式(7.0以后的版本支持)

      set target-async 1

      set pagination off

      set non-stop on

      gdb啟動(dòng)了不停模式,除了斷點(diǎn)有關(guān)的線程會(huì)被停下來(lái),其他線程會(huì)執(zhí)行。

      8.信號(hào)量

      (1).singal 發(fā)送信號(hào)

      假定你的程序已將一個(gè)專(zhuān)用的 SIGINT(鍵盤(pán)輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,

      要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:

      (gdb) signal 2

      (2).handle 攔截信號(hào)

      Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:

      * nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。

      * stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)

      * print 接受到信號(hào)時(shí)顯示一條消息

      * noprint 接受到信號(hào)時(shí)不要顯示消息(��且隱含著不停止程序運(yùn)行)

      * pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。

      * nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。

      比如:

      handle SIGPIPE stop print //截獲SIGPIPE信號(hào),程序停止并打印信息

      handle SIGUSR1 nostop noprint //忽略SIGUSR1信號(hào)

      9.生成環(huán)境使用GDB場(chǎng)景

      內(nèi)核轉(zhuǎn)儲(chǔ)(coredump)

      (1).配置產(chǎn)生core文件

      前置條件:確保系統(tǒng)配置的core file size足夠,一般設(shè)置成unlimited

      ulimit -c unlimited

      配置corefile的參數(shù):

      echo 2 > /proc/sys/fs/suid_dumpable [程序中切換用戶,也要產(chǎn)生corefile]

      mkdir /tmp/corefiles

      chmod 777 /tmp/corefiles

      echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件產(chǎn)生的目錄為/tmp/corefiles

      echo "1" > /proc/sys/kernel/core_uses_pid

      注意:

      a.確保配置的目錄有足夠的磁盤(pán)空間,否則產(chǎn)生core文件可能不完整。

      b.對(duì)于mysqld而言,要保證正確產(chǎn)生core-file,需要加上--core-file,默認(rèn)這個(gè)參數(shù)是不打開(kāi)的。

      c.kill -9 pid 是不能產(chǎn)生core文件的,因?yàn)镾IGKILL信號(hào)不能被捕獲。

      (2).使用core文件

      gdb /usr/MySQL/bin/mysqld core.24556

      (3).dump已經(jīng)運(yùn)行進(jìn)程的狀態(tài)信息

      gdb attach pid

      (gdb) generate-core-file

      調(diào)試完畢后,通過(guò)detach命令退出。

      另外,通過(guò)gcore pid 命令也可以dump core文件,生成在當(dāng)前目錄下。

      (4).打印線程信息

      pstack pid

      pt-pmp -p pid

      pstack和pt-pmp都可以打印線程的信息,但是pt-pmp會(huì)對(duì)同類(lèi)堆棧的線程做聚合匯總,相對(duì)于pstack功能更強(qiáng)大,顯示也更友好。

      (5).altert日志

      這里主要針對(duì)mysqld問(wèn)題排查,mysqld異常crash后,有時(shí)候在alter日志中可以看到最后crash線程的堆棧,但是一般只有函數(shù)名或一串二進(jìn)制地址,無(wú)法定位到具體是crash到哪一行,通過(guò)addr2line可以解這個(gè)問(wèn)題。

      比如:alter日志中記錄crash時(shí)的地址是0x64bd60,通過(guò)如下命令,可以定位到具體是哪一行

      addr2line -e /usr/mysql/bin/mysqld 0x64bd60

      /home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067

      參考文檔

      https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/

      GDB調(diào)試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

      GDB+GDBserver無(wú)源碼調(diào)試Android 動(dòng)態(tài)鏈接庫(kù)的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

      使用hello-gl2建立ndk-GDB環(huán)境(有源碼和無(wú)源碼調(diào)試環(huán)境) http://www.linuxidc.com/Linux/2013-06/85935.htm

      在Ubuntu上用GDB調(diào)試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm

      Linux下用GDB調(diào)試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm

      Ubuntu下使用GDB斷點(diǎn)Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

      使用GDB命令行調(diào)試器調(diào)試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm


    看了“linux gdb調(diào)試基本命令”還想看:

    1.linux常用基本命令

    2.必學(xué)100個(gè)常用linux命令大全

    3.六個(gè)實(shí)用的Linux命令整理

    4.Linux系統(tǒng)有什么常用命令

    5.Linux基礎(chǔ)命令大全介紹

    2805336 主站蜘蛛池模板: jizz视频护士| www.99色| 欧美卡2卡4卡无卡免费| 哪里可以看黄色播放免费| 4480私人午夜yy苍苍私人影院| 扒开双腿疯狂进出爽爽爽动态图| 亚洲国产精品嫩草影院久久| 美国十次啦大导航| 国产欧美一区二区三区观看| jizz18日本人在线播放| 日本高清视频在线www色| 亚洲欧美综合在线天堂| 美国式的禁忌19| 国产无遮挡又黄又爽在线视频 | 欧洲精品一卡2卡三卡4卡乱码| 又爽又黄又无遮挡的视频在线观看 | 国产欧美一区二区三区视频在线观看| xxxxx做受大片视频免费| 日韩中文字幕高清在线专区| 亚洲欧美日韩精品久久奇米色影视| 老司机永久免费网站在线观看| 国产精品久久久久影院| caoporn国产精品免费| 日本一二三高清| 亚洲一卡二卡三卡| 澳门永久av免费网站| 噗呲噗呲好爽轻点| 黄乱色伦短篇小说h| 日韩卡一卡2卡3卡4| 亚洲日韩在线视频| 男操女视频免费| 国产乱了真实在线观看| 四虎免费影院ww4164h| 在线免费观看中文字幕| 三级国产4国语三级在线| 日韩一区二三区国产好的精华液| 亚洲欧美国产精品完整版| 精品久久久久香蕉网| 国产三级在线视频播放线| 人人干人人干人人干| 国产网站在线看|