使用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可以知道。不过好像没有起效果。