gdb+gdbserver远程调试技术(二)解决segmentation-fault

segmentation-fault段错误一直是一个很难解决的问题,尤其是当代码量很大的时候寻找起来更是如大海捞针一般,本文将介绍通过gdb+gdbserver来找到出错的位置。

segmentation-fault段错误有时候每次都能重现出来,这种问题相对来说比较好调试可以直接在线调试。有的问题比较难重现,甚至可能运行好几天才有可能重现,这种问题一般是通过分析segmentation-fault段错误产生的core文件。

下面给出本文用的示例代码:
test.c

#include <stdio.h>  
#include <string.h>

int main()  
{  
	char* p;

	memcpy(p, "hello", 5);

    return 0;  
} 

用gdb调试代码时必须加上-g选项,如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。先对示例代码交叉编译到目标机上:

arm-linux-gnueabi-gcc -g test.c -o test

将生成的可执行程序test拷贝到目标机上便可以开始本次试验了。

一、直接在线调试

1.在目标机上启动gdbserver
$ gdbserver 192.168.0.139:6666 /test 

这里写图片描述

2.在宿主机上启动gdb
$ arm-linux-gdb test

这里写图片描述

3.连接目标机
(gdb) target remote 192.168.0.138:6666

若连接成功会有下面提示:
这里写图片描述

在目标机上也有连接成功提示:
这里写图片描述

4.调试

执行指令 c(continue)让程序开始执行并出错,若错误简单可直接显示出错误的具体位置:
这里写图片描述

可以通过指令bt来查看当前的堆栈信息:
这里写图片描述

若程序比较复杂,出错时没有显示出具体的出错信息,可通过where指令来查看出错的位置:
这里写图片描述

二、抓取core文件

1.系统设置

Linux系统默认core文件的大小限制为0,即产生segmentation-fault段错误时不会生成core文件,可以通过ulimit -c指令来查看系统限制。可以通过ulimit -c filesize命令来修改系统对core文件大小的限制,但如果core文件超过限制大小(filesize的单位为kbyte)将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。所以一般情况下不会限制core文件的大小,指令如下:

$ ulimit -c unlimited
2.产生core文件

当运行程序出现segmentation-fault段错误时,如果产生core文件,会在终端有如下打印:
这里写图片描述

在当前目录下也会生成core文件:
这里写图片描述

3.调试core文件

core文件产生之后将其拷贝到宿主机,不需要连接目标机便可调试。运行下列指令启动gdb:

$ arm-linux-gdb test core

这里写图片描述

由于本文采用的示例比较简单,gdb已经列出了出错的具体位置,敲击回车,gdb列出了具体出错的代码:
这里写图片描述

可以通过指令bt来查看堆栈信息:
这里写图片描述

可以通过where指令来定位出错的位置:
这里写图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: gdbgdbserver远程调试技术的意义在于提供了一种方便有效的方式来调试运行在远程目标设备上的程序。这对于嵌入式系统或远程服务器等分布式系统的开发和调试非常有用。 首先,gdbgdbserver远程调试技术允许开发人员在不在本地环境下的目标设备上进行调试。这意味着开发人员可以通过网络连接到远程设备,并使用本地的gdb客户端来远程控制和调试目标设备上的程序。这样,不再需要将全部的代码和调试环境放在开发人员的本地机器上,大大节省了开发人员的时间和资源。 其次,远程调试技术提供了实时调试的能力。开发人员可以监控目标设备上的程序执行过程,并在运行时观察程序的状态和变量的值。这对于发现和解决运行时错误和异常非常重要。通过远程调试,开发人员可以更直接地了解程序在实际环境下的行为,从而更有效地修复问题。 此外,远程调试技术还提供了一个更加安全且可靠的调试方法。使用gdbgdbserver进行远程调试,可以避免将敏感的代码或数据复制到本地环境中,减少了潜在的安全风险。同时,由于远程调试是通过网络进行的,即使目标设备处于远程位置,也能够进行调试,减少了物理上接触设备的需求,提高了效率。 总而言之,gdbgdbserver远程调试技术的意义在于提供了一种方便、实时、安全的方法来远程控制和调试目标设备上的程序,使开发人员能够更有效地进行嵌入式系统和分布式系统的开发和调试工作。 ### 回答2: gdb gdbserver远程调试技术是一种用于在线调试嵌入式系统的工具。它的意义在于提供了一种便捷和高效的方式来调试远程的嵌入式设备。 首先,gdb gdbserver远程调试技术可以节省时间和资源。在传统的调试方式中,如果想要调试远程的嵌入式设备,通常需要将设备连接到开发服务器并使用串口进行调试。这种方式不仅繁琐,还占用了宝贵的硬件资源。而gdb gdbserver远程调试技术可以直接在目标设备上运行gdbserver,并通过网络连接到开发服务器上的gdb,使得调试变得更加方便快捷。 其次,gdb gdbserver远程调试技术可以提高团队协作效率。在实际的嵌入式系统项目中,通常会有多个开发人员同时开展工作。使用gdb gdbserver远程调试技术,不同的开发人员可以同时连接到同一个目标设备上进行调试,而不会相互干扰。这样可以提高团队成员之间的协作效率,加快问题解决和软件开发的速度。 此外,gdb gdbserver远程调试技术还提供了更灵活的调试方式。通过gdb gdbserver的支持,开发人员可以在目标设备上进行远程程序的调试,包括断点设置、变量查看、程序运行控制等。这种方式可以更加直观地观察到程序的实际执行情况,帮助开发人员更好地理解和解决问题。 总之,gdb gdbserver远程调试技术的意义在于提供了一种便捷、高效和灵活的嵌入式系统调试方式,节省了时间和资源,提高了团队协作效率,同时也方便开发人员更好地理解和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值