使用gdb调试user程序

目前有3种方法:

方法一:将进程crash生成的corefile,从目标板子上拷贝到pc上进行分析。

    缺点比较明显,不能实时debug进程。

    优点也很明显,不需要单独编译user gdb,直接用toolchain中的就可以了。

方法二和方法三的思路都是一致的,将gdb编译出来,下载到板子上运行,动态的debug程序。只不过编译生成gdb的方法不一样。

方法二:直接将gdb的source code放到sdk相应的user目录下,编译。结果是 编译的gdb查看 多线程的coredump file时,会导致gdb本身crash

方法三:将toolchain和gdb下载到自己的ubuntu笔记本电脑上,直接编译。结果是 编译出来的gdb可以debug 多线程,不会导致gdb本身crash,也可以正常的debug某一个线程。

    不过,想切换到同一进程的其他线程,目前还不支持。原因应该是 缺少图片中所示的lib。

 

方法一:将coredump文件放到服务器,再用toolchain的gdb查看

1.打开core功能,并设置生成的core文件的路径和文件名格式(都是临时修改,重启不会保存)

ulimit -c unlimited

echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

2.生成core文件

做完第一步后,重新拉起待监测的进程,使其crash

core-myClient-11415-1635469554

3.将生成的core文件导入到服务器上

如果是ftp传输,注意切换到binary传输模式,否则会在后面出现gdb不认识core文件

4.找到toolchain里的gdb,并读取nostrip的可执行档

./msdk-linux-gdb ~ /romfs_nostrip/bin/ myClient

5.读取刚刚生成的core file,目前这个是 strip的可执行档生成的

(gdb) core-file ~/core- myClient -11415-1635469554

 

结果如下

Core was generated by `/bin/myClient.

Program terminated with signal SIGSEGV, Segmentation fault.

#0  0x004a2c78 in set_ParameterValue (name=<error reading variable: Cannot access memory at address 0x3fec00>,

    type=<error reading variable: Cannot access memory at address 0x3fec04>,

    value=<error reading variable: Cannot access memory at address 0x3fec08>) at parameter_api.c:1926

1926                            test_return = entity->info->op->setvalue(name, entity, type, value);

 

这样就可以定位到程序哪里出问题了。

 

方法二:借鉴客户的方法,直接编译user gdb,并放到板子当中运行

1.下载gdb 7.12 source code,并用我们的toolchain编译生成可执行档

2.将unstrip的myClient下载到板子中,修改为可执行并重新运行,等待crash出现,出现core dump file

3.运行./gdb myClient -c core- myClient -11329-1635473088

 

目前这个方案只是理论上行的通,实践上存在一个问题,gdb虽然可以正常起来运行,不过加入core file的时候会出现gdb crash,

看warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

应该是gdb运行依赖于libthread_db,而我们现在没有,或者版本不匹配

所以我们现在调试多线程的进程是不可以的

 

 

方案三 由于方案二一直行不通,所以试试其他路子

1.下载toolchain到自己的ubuntu电脑,并解压

2.切换到root用户,并执行如下命令,设置环境变量

export CC=/toolchain_path/bin/mips-linux-gcc

export CXX=/toolchain_path/bin/mips-linux-g++

export LD=/toolchain_path/bin/mips-linux-ld

export STRIP=/toolchain_path/bin/mips-linux-strip

export AR=/toolchain_path/bin/mips-linux-ar

3.下载gdb7.12 source code,并解压

4. cd gdb-7.12

./configure --host=mips-linux  --disable-libquadmath

make

5.我们的libthread_db.so需要在我们的代码中设置成no strip,这样板子中/lib才有这个库

6.启动gdb后输入 set auto-load safe-path /

 

 

至此,在debug多线程的进程时,不会导致gdb本身crash,看起来可以正常使用了。不过,这里应该还是没有完全使用。

虽然现在可以debug多线程,不过线程间的切换,应该是不行的,因为gdb依赖于缺少的上图中的库。

不过,目前已经可以满足工作需求,后面有时间再研究,怎么编译才能支持多线程debug。

 

ps1:目前./configure 少了选项--with-build-libsubdir=$TARGET_DIR/lib,后面还要再研究下,这可能与上图打印有关系

ps2:上面的第5步和第6步是为了试图让板子中有相关的lib,并且gdb可以知道。不过好像没有起效果。

posted @ 2021-10-30 10:05  midhillzhou  阅读(1793)  评论(0编辑  收藏  举报