GDB遠程調試技術

<!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋體; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} h1 {mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"標題 1 Char"; mso-style-next:正文首行縮進; margin-top:6.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:21.25pt; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:-21.25pt; line-height:240%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; mso-list:l0 level1 lfo1; tab-stops:list 21.25pt; font-size:14.0pt; font-family:"Times New Roman","serif"; mso-font-kerning:22.0pt;} h2 {mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"標題 2 Char"; mso-style-next:正文首行縮進; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:1.0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:-1.0cm; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; mso-list:l0 level2 lfo1; tab-stops:list 1.0cm; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-font-kerning:1.0pt;} h3 {mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"標題 3 Char"; mso-style-next:正文首行縮進; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:35.45pt; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:-35.45pt; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:3; mso-list:l0 level3 lfo1; tab-stops:list 35.45pt; font-size:10.5pt; font-family:"Times New Roman","serif"; mso-font-kerning:1.0pt;} h4 {mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"標題 4 Char"; mso-style-next:正文; margin-top:14.0pt; margin-right:0cm; margin-bottom:14.5pt; margin-left:42.55pt; text-align:justify; text-justify:inter-ideograph; text-indent:-42.55pt; line-height:156%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:4; mso-list:l0 level4 lfo1; tab-stops:list 42.55pt; font-size:10.5pt; mso-bidi-font-size:14.0pt; font-family:"Times New Roman","serif"; mso-font-kerning:1.0pt;} p.MsoBodyText, li.MsoBodyText, div.MsoBodyText {mso-style-noshow:yes; mso-style-priority:99; mso-style-link:"正文文本 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:6.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋體; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoBodyTextFirstIndent, li.MsoBodyTextFirstIndent, div.MsoBodyTextFirstIndent {mso-style-unhide:no; mso-style-parent:正文文本; mso-style-link:"正文首行縮進 Char"; margin-top:0cm; margin-right:0cm; margin-bottom:6.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:10.0pt; mso-char-indent-count:2.0; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋體; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:21.0pt; mso-pagination:widow-orphan; font-size:10.5pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋體; mso-bidi-font-family:宋體;} span.1Char {mso-style-name:"標題 1 Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"標題 1"; mso-ansi-font-size:14.0pt; mso-bidi-font-size:14.0pt; font-family:"Times New Roman","serif"; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:22.0pt; font-weight:bold;} span.2Char {mso-style-name:"標題 2 Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"標題 2"; mso-ansi-font-size:12.0pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:1.0pt; font-weight:bold;} span.3Char {mso-style-name:"標題 3 Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"標題 3"; mso-ansi-font-size:10.5pt; mso-bidi-font-size:10.5pt; font-family:"Times New Roman","serif"; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:1.0pt; font-weight:bold;} span.4Char {mso-style-name:"標題 4 Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"標題 4"; mso-ansi-font-size:10.5pt; mso-bidi-font-size:14.0pt; font-family:"Times New Roman","serif"; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:1.0pt; font-weight:bold;} span.Char {mso-style-name:"正文文本 Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:正文文本; mso-ansi-font-size:10.5pt; mso-bidi-font-size:11.0pt; mso-font-kerning:1.0pt;} span.Char0 {mso-style-name:"正文首行縮進 Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-parent:"正文文本 Char"; mso-style-link:正文首行縮進; mso-ansi-font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-fareast-font-family:宋體; mso-hansi-font-family:Calibri; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1250192913; mso-list-template-ids:-82661896;} @list l0:level1 {mso-level-style-link:"標題 1"; mso-level-tab-stop:21.25pt; mso-level-number-position:left; margin-left:21.25pt; text-indent:-21.25pt;} @list l0:level2 {mso-level-style-link:"標題 2"; mso-level-text:"%1/.%2/."; mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:1.0cm; text-indent:-1.0cm;} @list l0:level3 {mso-level-style-link:"標題 3"; mso-level-text:"%1/.%2/.%3/."; mso-level-tab-stop:35.45pt; mso-level-number-position:left; margin-left:35.45pt; text-indent:-35.45pt;} @list l0:level4 {mso-level-style-link:"標題 4"; mso-level-text:"%1/.%2/.%3/.%4/."; mso-level-tab-stop:42.55pt; mso-level-number-position:left; margin-left:42.55pt; text-indent:-42.55pt;} @list l0:level5 {mso-level-text:"%1/.%2/.%3/.%4/.%5/."; mso-level-tab-stop:49.6pt; mso-level-number-position:left; margin-left:49.6pt; text-indent:-49.6pt;} @list l0:level6 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/."; mso-level-tab-stop:2.0cm; mso-level-number-position:left; margin-left:2.0cm; text-indent:-2.0cm;} @list l0:level7 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/."; mso-level-tab-stop:63.8pt; mso-level-number-position:left; margin-left:63.8pt; text-indent:-63.8pt;} @list l0:level8 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8/."; mso-level-tab-stop:70.9pt; mso-level-number-position:left; margin-left:70.9pt; text-indent:-70.9pt;} @list l0:level9 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8/.%9/."; mso-level-tab-stop:77.95pt; mso-level-number-position:left; margin-left:77.95pt; text-indent:-77.95pt;} @list l1 {mso-list-id:1399160376; mso-list-type:hybrid; mso-list-template-ids:-1468636620 -702379306 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1、; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1:level2 {mso-level-tab-stop:72.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level3 {mso-level-tab-stop:108.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level4 {mso-level-tab-stop:144.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level5 {mso-level-tab-stop:180.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level6 {mso-level-tab-stop:216.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level7 {mso-level-tab-stop:252.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level8 {mso-level-tab-stop:288.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l1:level9 {mso-level-tab-stop:324.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2 {mso-list-id:2135560946; mso-list-type:hybrid; mso-list-template-ids:-1013819510 -484532356 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1 {mso-level-text:%1、; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l2:level2 {mso-level-tab-stop:72.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level3 {mso-level-tab-stop:108.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level4 {mso-level-tab-stop:144.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level5 {mso-level-tab-stop:180.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level6 {mso-level-tab-stop:216.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level7 {mso-level-tab-stop:252.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level8 {mso-level-tab-stop:288.0pt; mso-level-number-position:left; text-indent:-18.0pt;} @list l2:level9 {mso-level-tab-stop:324.0pt; mso-level-number-position:left; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

1.       遠程調試的意義

1、 軟件只在特定機器環境下出錯,可以通過遠程調試來查找出錯原因。

2、 與第三方合作,不方便提供代碼,但是又必須解決在合作方機器上出現的特定bug

3、 嵌入式開發。

 

2.       注意事項

1 、要gdb 支持遠程調試,則必須在遠程機器上安裝gdb server ,包含在gdb 源碼中(缺省不安裝gdb server ),需要另外編譯安裝。

2 、要求兩邊的gdb 版本必須一致。

3 、遠程機器必須有目標程序,調試時需要通過gdb server 來啓動目標程序。

4 、客戶機(本地機器)必須有源碼,否則debug 時無法跟蹤符號。

5 、客戶機和服務器的操作系統版本要兼容。

6 、編譯時不能採用-g –O2 ,只能採用-g ,否則編譯器會做優化,代碼不一定按照正常順序執行,對於遠程調試造成一定困擾。

7

 

3.       安裝步驟

1 、查看客戶機和遠程機器的gdb 版本:rpm -qa|grep gdbgdb -v

2 、下載gdb 源碼(http://ftp.gnu.org/gnu/gdb/ ), 我選擇的是gdb-6.3.tar.gz

3 tar xvfz gdb-6.3.tar.gz

4 cd gdb-6.3

5 、如果機器上沒有安裝gdb ,則執行:./configure;make;make install ,否則進入下一步。

   建議還是都執行一下上面的命令。

如果不執行上面的配置和重新編譯,則在曾經升級過gcc 的機器上會出現一些問題。

6 cd gdb;cd gdbserver

7 ./configure;make;make install

8

 

4.       調試步驟

1、 測試環境:公司外網機房,192.168.93.164 (客戶機),192.168.93.165 (遠程機,目標機器),操作系統Linux AS 4

2、 在遠程機進入目標程序目錄。

3、 在目標機(server) 啓動程序 gdbserver 192.168.93.164:1100 test, 設置信任的客戶端機器和監聽端口,並啓動目標程序。

顯示如下類似結果,表明gdbserver 啓動成功:

[root@localhost test]# gdbserver 192.168.93.164:1100 test

Process test created; pid = 19578

Listening on port 1100

4、 在客戶端機器上進入源碼目錄,啓動gdb 調試:gdb test

5、 連接到遠程目標服務器:(gdb) target remote 192.168.93.165:1100

客戶端會出現:

(gdb) target remote 192.168.93.165:1100

Remote debugging using 192.168.93.165:1100

0x007047c0 in ?? ()

   服務器端出現:

       Remote debugging from host 192.168.93.164

   這種情況表明遠程調試的客戶端和服務器正確建立連接,並準備開始遠程調試。

   這一步比較關鍵。

6、 執行gdb 調試命令,跟本地調試基本一樣。

7、 執行list 命令:

(gdb) list

1       #include <stdio.h>

2       int main( void )

3       {

4               int i=2;

5               int x, y;

6

7               x=(++i);

8               printf(" %d %d/n", i,x);

9               x+=(++i);

10              printf(" %d %d/n", i,x);

8、 執行其他命令:

(gdb) b 9

Breakpoint 1 at 0x8048636: file main.cpp, line 9.

(gdb) b 11

Breakpoint 2 at 0x8048647: file main.cpp, line 11.

(gdb) break 13

Breakpoint 3 at 0x8048658: file main.cpp, line 13.

(gdb) list 9,16

9               x+=(++i);

10              printf(" %d %d/n", i,x);

11              x+=(++i);

12              printf(" %d %d/n", i,x);

13              i=2;

14              y=(i++)+(i++)+(i++);

15              printf(" %d %d/n", i,y);

16

(gdb) b 16

Breakpoint 4 at 0x8048669: file main.cpp, line 16.

9、 調試斷點:

(gdb) c

Continuing.

10、     服務器端(目標機器)上輸出:

[root@localhost test]# gdbserver 192.168.93.164:1100 test

Process test created; pid = 13235

Listening on port 1100

Remote debugging from host 192.168.93.164

 3 3

 4 7

 5 12

 5 6

 

Child exited with retcode = 0

 

Child exited with status 0

GDBserver exiting

11、     特別注意必須使用ccontinue ,不能使用runr ,因爲要調試遠程的目標程序,不是運行本地的程序副本。

12、      

 

5.       附測試源代碼

#include <stdio.h>

int main( void )

{

    int i=2;

    int x, y;

 

    x=(++i);

    printf(" %d %d/n", i,x);

    x+=(++i);

    printf(" %d %d/n", i,x);

    x+=(++i);

    printf(" %d %d/n", i,x);

    i=2;

    y=(i++)+(i++)+(i++);

    printf(" %d %d/n", i,y);

 

    return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章