gdbserver 移植与多线程调试
在嵌入式linux平台使用gdb调试进行远程调试需要安装gdbserver,gdbserver工作在目标板上,通过串口或者网线与主机上的gdb互联实现远程调试。
Gdbserver需要根据不同的嵌入式平台来编译生成,首先到http://ftp.gnu.org/gnu/gdb/下载合适的版本。然后在本地进行编译。在Unbuntu下编译gdb需要安装ncurses 库,在redhat上通过yum install “Development tools” 安装依赖就可以了。
首先编译主机端gdb,编译过程如下:
解压源码包:
$> tar xzvf gdb 7.3.1.tar.gz
进入目录:
$>cd gdb-7.3.1
生成makefile文件:
$>./configure --target=arm-linux --prefix=/mygdb7.3.1
或者,如果是mips平台
$>./configure --target=mips-linux --prefix=/mygdb7.3.1
$> make
$> make install
执行结束之后你就会在mygdb7.3.1文件夹下bin目录找到arm-linux-gdb 或者 mips-linux-gdb 可执行文件。
注意:执行 configure 步骤的时候目录一定要选对,否则编译会失败,各种找到不到依赖!
此外,由于这是生成在Linux主机上调试的可执行文件,因此不必使用交叉编译环境,换句话说在编译生成gdbserver的时候需要使用交叉编译器。
接下来编译运行在目标板上的gdbserver。
首先进入gdbserver目录(在gdb7.3.1目录中):
$>cd gdb gdbserver
生成makefile文件,这一步需要指定交叉编译器的位置,假设你交叉编译的位置在xx/yy目录下:
$>CC=xx/yy/arm-linux-gcc ./configure --target=arm-linux --host=arm-linux
生成gdbserver
$> make
这里没有指定—prefix参数,因此生成的gdbserver就位于 gdb7.3.1/gdb/gdbserver目录下。
现在可以将gdbserver移植到目标板中了,方法有很多,就看你的环境了,可以使用nfs,可以使用tftp等工具。
进行调试:
假设我们使用交叉编译器产生了一个helloworld可执行程序,在目标板上运行:
$> gdbserver 192.168.1.100:2345 helloworld
其中 192.168.1.100 是调试主机的地址,2345是调试端口,helloword是需要调试的可执行程序。
随后在主机上运行:
$> gdb helloworld
$> target remote 192.168.1.10:2345
其中 192.168.1.10 是目标板的地址,2345是gdbserver打开的用于创建调试连接的端口。
可能遇到的问题:
- 在调试实际模块的时候,设置了断点一运行就表现出各种找不到动态连接库(.so)
可以这样设置:set solib-search-path PATH
通过上面设置告诉gdb所以来的动态库在那里,其中PATH是被调试可执行程序所需的动态库的位置,多个不同路径可以使用“:”来隔开,这些路径一般都是你价差编译工具链的位置。
2. 在调试多线程程序的时候目标板出现“gdb: error initializing thread_db library”“Child terminated with signal 5”
出现这个问题的原因有很多,有可能是你目标板上没有thread_db 库,但是也有可能是你使用的gdb版本过低不支持多线程调试(注意gdb7.0以下就不支持! 我当时一味的追求生成的文件小就使用gdb6.3 这个问题一直没有找到原因,折腾了一阵,最好也不要使用strip裁剪生成的可执行文件)。
3. 编译gdb失败:提示在linux-low.c中“siginfo isn’t known”
进入到linux-low.c 中,找到相应函数(大概有两个函数),将 struct siginfo 全部换成为 siginfo_t。
4. 多线程调试可以设置 set follow-fork-mode child/parent
表示在多线程中产生新线程的时候gdb进入到子线程还是父线程。
Gdb多线程调试常用命令:
http://coolshell.cn/articles/3643.html
多线程调试可能是问得最多的。其实,重要就是下面几个命令:
- info thread 查看当前进程的线程。
- thread <ID> 切换调试的线程为指定ID的线程。
- break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。
- set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
- off 不锁定任何线程,也就是所有线程都执行,这是默认值。
- on 只有当前被调试程序会执行。
- step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
gdbserver 移植与多线程调试的更多相关文章
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...
- [skill][gdb] gdb 多线程调试
中文快速入门: http://coolshell.cn/articles/3643.html (关于多线程的部署说的并不太对) 进阶: 多进程相关概念: inferiors 是什么? http://m ...
- gdb 多线程调试
gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/lit ...
- GDB多线程调试
一.多线程调试1. 多线程调试,最重要的几个命令:info threads 查看当前进程的线程. ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- gdb的多线程调试
info threads 可以查看当前进程有哪些线程 thread ID 可以切换到线程ID bt 查看当前线程堆栈 set scheduler-locking on多线程调试过程中, 线程会来回切换 ...
- GDB常用调试命令以及多进程多线程调试
http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list linenum 显示程序第l ...
- 多线程调试必杀技 - GDB的non-stop模式
作者:破砂锅 (转) 开源的GDB被广泛使用在Linux.OSX.Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜. 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持a ...
- GDB:从单线程调试到多线程调试(MFiX单步调试)
GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 ...
随机推荐
- X.509 数字证书结构和实例
http://www.cppblog.com/sleepwom/archive/2010/07/08/119746.html 一. X.509数字证书的编码 X.509证书的结构是用ASN1(Abst ...
- NavigateToPageAction打开新页面
首先要加上两个命名空间 分别为: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.In ...
- rTorrent + ruTorrent 安装和配置
原文地址:http://wangyan.org/blog/rtorrent-and-rutorrent-tutorial.html rTorrent 是一款非常简洁优秀的BT客户端,它完全基于文本并可 ...
- js alert换行
<script type="text/javascript"> alert("hello \n world!"); </script>
- WordPress主题开发:设置和获取浏览次数
将以下代码放在functions.php,一个是获取阅读量,一个是设置阅读量 <?php /** * getPostViews()函数 * 功能:获取阅读数量 * 在需要显示浏览次数的位置,调用 ...
- .NET培训 | JAVA培训 | 最课程
最课程(www.zuikc.com) 软件开发培训,在线软件培训的创新者!我们的创新在于: 1:一次购买,终身服务.每个最课程学员都会分配一位专职教师及一位监管教师,点对点跟进课程进度,直到您学会课程 ...
- 《成神之路-基础篇》JVM——Java内存模型(已完结)
Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...
- 使用ASP.NET AJAX与Bootstrap 弹窗解决方案
我在做采购系统时,因为使用了ASP.NET AJAX的UpdatePanel的控件,可以使得页面局部刷新显示.但是使用起来问题还是很多. 下面列出了一种情况,花了将近5个小时才算解决,虽然不是很完美, ...
- Class:Task 类
ylbtech-.Net-Class:Task 类 1. Task 类返回顶部 1-1. #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, ...
- WebFormViewEngine及用户控件寻址bug
在做我的网站的时候遇到了主题切换的问题,特总结与大家共享. 熟悉asp.net mvc的朋友都知道,mvc中,默认情况下视图都在views文件夹下放着.要想改变文件必须重写WebFormViewEng ...