好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

gdbserver 移植与多线程调试

// 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的行为)以外,只有当前线程会执行。
转载自:http://www.cnblogs.com/zhuyp1015/p/3619589.html

 

gdbserver 移植与多线程调试

标签:

查看更多关于gdbserver 移植与多线程调试的详细内容...

  阅读:28次