gdb 如何制作(gdb target,gdb server)

来源:互联网 发布:大数据相关体系架构 编辑:程序博客网 时间:2024/05/21 10:48

   序言: 

   GDB 调试技术分为两种。 第一种是PC gdb+target gdbserver ,第二种是单独在target gdb调试。

    source code 下载地址:ftp://ftp.gnu.org/gnu/gdb/

    在build 过程中需termcap 开源库支持:ftp://ftp.gnu.org/gnu/termcap/


1、准备工作build termcap

    #./configure--target=armv7l-tizen-linux-gnueabi --host=armv7l-tizen-linux-gnueabi--prefix=/usr/local/arm_gdb_termcap

    #makeCC=/toolchain/Tizen/armv7l-tizen-20140701/opt/cross/bin/armv7l-tizen-linux-gnueabi-gcc

   #cp  /Make_Gdb/termcap-1.3.1/libtermcap.a  /Make_Gdb/gdb-7.8


2. 制作PC gdb+target gdbserver 

 PC gdb:

    #tar -xvf gdb-7.9.1.tar                                                                                                  

   #cd /Make_Gdb/gdb-7.9.1/                                                                           

    #./configure--with-expat=builtin --target=armv7l-tizen-linux-gnueabi  --host=armv7l-tizen-linux-gnueabi--prefix=/usr/local/arm-gdb_target LDFLAGS="-L$(pwd) -ltermcap -lm"

    #make

   #make install

  产生的bin :/usr/local/arm-gdb_target/bin/gdb就是要更新到板子的gdb


target gdbserver:

   #cd /Make_Gdb/gdb-7.9.1/gdb/gdbserver

   #./configure--target=armv7l-tizen-linux-gnueabi --host=armv7l-tizen-linux-gnueabi

   #makeCC=/toolchain/Tizen/armv7l-tizen-20140701/opt/cross/bin/armv7l-tizen-linux-gnueabi-gcc

   out:   /Make_Gdb/gdb-7.9.1/gdb/gdbserver/gdbserver

使用流程图:


pc :192.168.1.1

target ip:192.168.1.33

STEP1:超级终端或者minicom下(target :gdbserver)

[root@localhost]cd /work

[root@localhost]./gdbserver192.168.1.1:1234 hello

出现提示:
Process/work/hello created: pid=69
Listening on port 1234

 

STEP2:这时切换到宿主机的控制台(PC gdb),运行

[root@localhost]arm-softfloat-linux-gnu-gdb hello

(gdb) target remote 192.168.1.33:1234

出现提示:
Remote debugging using192.168.1.33:1234
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()


STEP3:同时在minicom(targetgdbserver)下提示:
Remote debugging from host192.168.1.1
(gdb)

连接成功,这时候就可以输入各种gdb命令如list、continue、next、step、break等进行程序调试了。

      备注:

     将gdbserver到开发板上,使之可以运行。

     开发板上的hello文件可能是运行arm-linux-…-strip命令后的文件,size很小,在Linux主机上不能用strip命令生成的hello文件,使用原始的hello文件。

     可以调试板子产生的coredump 文件,原理就是没有strip的lib在PC 上模拟板子的环境,解析coredump文件,追查出register 的信息,定位问题

     (解析coredump 文件,可以参考:

            http://blog.chinaunix.net/uid-24922718-id-3489839.html                                  

             http://lazycat.is-programmer.com/posts/31925.html

      )


3、target gdb 制作

    #tar -xvf gdb-7.9.1.tar                                                                                                  

    #cd /home/xf.wang/Make_Gdb/gdb-7.9.1/                                                                           

    #./configure--with-expat=builtin --target=armv7l-tizen-linux-gnueabi  --host=armv7l-tizen-linux-gnueabi--prefix=/usr/local/arm-gdb_target LDFLAGS="-L$(pwd) -ltermcap -lm"

    #make

    #make install

产生的bin :/usr/local/arm-gdb_target/bin/gdb就是要更新到板子的gdb,就可以进行板级的gdb 调试工作了


实际在target gdb应用例子:

 sh-3.2# gdb_mstar hello

Reading symbols from/hello...done.

(gdb) list

1      #include<stdio.h>

2      int main()

3      {  int i = 0;

4         printf ("hello world0 i =%d\n", i);

5         return 0;

6       }

 (gdb) run

Starting program: /hello

hello world0 i =0

[Inferior 1 (process 196)exited normally]

(gdb)

 

4、Gdb 进一步分析

=====================kernel 端的信息追查===========================

./kernel/signal.c:1175:

printk(KERN_ALERT"##### send signal SIG : %d, %s(%d)->%s(%d) %s\n",

   …..        

printk(KERN_ALERT "##### send signalfrom KERNEL, SIG : %d, %s, PID:%d, %s \n"

   

./lib/dump_stack.c :                                                                                                                          

dump_stack_print_info(KERN_DEFAULT);

show_stack(NULL, NULL......

-------------------------Kernel- .config--------------------------------------------------------------

CONFIG_PRINT_KILL_SIGNAL=y


 关掉kernel 不必要的dump_stack。gdb 调试时程序stop 触发force_sig_info(),因此为了更好的观看程序可以先不让kernel 打印这种信息。如何需要则不需要下面调整。

 关闭dump_stack:arch/arm/configs/PreX15-Tizen_debug_defconfig

 # CONFIG_PRINT_KILL_SIGNAL is not set 

知识点:

When use run time debugging in gdb, it will stop whenapproach to break point which user set point by SIG5.It will stop at same time with start so, even there isno breakpoint, it will stop.

At this time, force_sig_info() in kernelwill be used, it includes dump_stack()..  So, stack dump logis printed…Just printed kernel stack dump, it is normal process…


总结:本文主要讲述了gdb 的使用的两种方式。gdb如何设定断点,查看变量进行调试工作需要学习更多的gdb的知识,会在后续文章中更新。


附录备注:

git patch 为了不让gdb 输出一些不关心的log:

gdb-7.8/gdb/inflow@@ -308,13 +308,13 @@ terminal_inferior (void)     {     #ifdef HAVE_TERMIOS       result = tcsetpgrp (0, tinfo->process_group);-   if (!inf->attach_flag)+  if (!inf->attach_flag && errno != ENOTTY)      OOPSY ("tcsetpgrp");     #endif     #ifdef HAVE_SGTTY       result = ioctl (0, TIOCSPGRP, &tinfo->process_group);-  if (!inf->attach_flag)+  if (!inf->attach_flag && errno != ENOTTY)         OOPSY ("TIOCSPGRP");     #endif     }



0 0
原创粉丝点击