1. 远程调试的意义
1. 软件只在特定机器环境下出错,可以通过远程调试查找原因
2. 与第三方合作,不方便提供代码,但是又必须解决在合作方机器上出现的特定BUG
3. 嵌入式开发
2. 注意事项
1. 要gdb支持远程调试,则必须在远程机器上面安装gdbserver,
2. 要求两边的gdb版本必须一致
3. 远程机器必须有目标程序,调试时需要通过gdbserver来启动目标程序
4. 客户机(本地机器)必须有源码,否则debug时无法跟踪符号
5. 客户机和服务器的操作系统版本要兼容
6. 编译时不能采用-g –O2,只能采用-g,否则编译器会优化,代码不一定按照正常顺序执行,对于远程调试造成一定困扰
3. 安装步骤:
1. 查看客户机和远程机器的gdb版本可以用命令:rpm –qa | grep gdb
2. 下载gdb源码包(http://ftp.gun.org/gun/gdb)
3. 下载下来就可以解压,编译,安装,用tar命令和./configure;make;make install
4. 还可以用yum安装yum install gdb gdbserver
这个是我的远程机器安装了gdb和gdbserver
这个是本地机器只安装了gdb
4. 测试步骤
1. 测试环境,我的远程机器ip为(192.168.9.22) 本地机器ip为(192.168.16.4)
2. 可以查看它们相对应目录下面的东西
3. 在远程机器上面用gdbserver启动程序gdbserver 192.168.16.4:5678 sum
设置信任的客户机和监听端口,并启动程序.显示类是结果表明启动成功
4. 在本地进入源码目录,启动 gdb sum
5. 连接到远程目标机器(gdb)target remote192.168.9.22:5678
会显示如下信息
远程机器也会显示以下信息
出现remote debugging from host 192.168.16.4
这种情况说明远程调试机器和本地机器正确建立连接,并准备开始建立远程调试.
6. 执行gdb调试命令和本地调试基本一样
7. 运行需要注意用c 或continue,不能使用r或run,因为要调试的使远程目标程序,不是运行本地程序.
我是直接运行c执行命令本地显示结果如下
远程机器显示结果程序退出
代码的输出信息只在远程机器上面打印出来了.
5. 附录测试代码
#include
intfunc(int n)
{
intsum = 0 ,i;
for(i= 0; i < n; i++)
{
sum += i;
}
returnsum;
}
int main()
{
inti;
long result= 0;
for(i= 1; i <= 100 ; i++)
{
result+= i;
}
printf("result[1-100]= %d\n",result);
printf("result[1-250]= %d\n",func(250));
return0;
}