博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdbserver 移植与多线程调试
阅读量:5879 次
发布时间:2019-06-19

本文共 2294 字,大约阅读时间需要 7 分钟。

在嵌入式linux平台使用gdb调试进行远程调试需要安装gdbserver,gdbserver工作在目标板上,通过串口或者网线与主机上的gdb互联实现远程调试。  Gdbserver需要根据不同的嵌入式平台来编译生成,首先到下载合适的版本。然后在本地进行编译。在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多线程调试常用命令:多线程调试可能是问得最多的。其实,重要就是下面几个命令:info thread 查看当前进程的线程。thread 
切换调试的线程为指定ID的线程。break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。on 只有当前被调试程序会执行。step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。 转载自:

 

你可能感兴趣的文章
芬兰诺基亚欲投靠Android 但需等到2016年
查看>>
第十四天:规划质量管理,一致性成本、非一致性成本、质量七工具
查看>>
维基解密发布了 CIA 黑客攻击操作的代码
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——2.2 bash脚本编程
查看>>
Oracle存储过程迁移ODPS-00(专有云):Oracle - ODPS数据类型转换
查看>>
Ubuntu 发行版将停止支持 i386 架构
查看>>
《电路分析导论(原书第12版)》一第2章 电压和电流
查看>>
wine32和wine64共存编译安装方法
查看>>
《数字短片创作(修订版)》——数字短片原创理念的生成
查看>>
这个骨骼“有毒” 穿上它你就变成老人
查看>>
存储分层:企业数据存储类型选择与优化
查看>>
《Python参考手册(第4版•修订版)》——1.5 字符串
查看>>
2016:如何选择 Linux 发行版
查看>>
怎样在 Chromebook 上安装 Linux 系统?
查看>>
《循序渐进学Docker》——3.2 安装Windows和Ubuntu双系统
查看>>
《JavaScript开发框架权威指南》——1.7 创建Bower包
查看>>
《树莓派实战秘籍》——1.7 技巧07使用过压获得更高的性能
查看>>
我的 10 年自学编程之路
查看>>
Visual C# 2010入门经典》一1.4 编写第一个程序
查看>>
《HTML5 canvas开发详解(第2版)》——2.6 在画布上合成
查看>>