现在的位置: 首页 > 综合 > 正文

GDB远程调试技术

2013年08月09日 ⁄ 综合 ⁄ 共 12902字 ⁄ 字号 评论关闭


<!--
/* 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 gdb
gdb -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、    


特别注意必须使用c
continue

,不能使用run
r
,因为要调试远程的目标程序,不是运行本地的程序副本。

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;

}

 

【上篇】
【下篇】

抱歉!评论已关闭.