Linux下嵌入式程序仿真调试(GDB)(二)

2019-07-12 17:14发布

目录

前言

Linux下嵌入式程序仿真调试(GDB)(一)主要介绍了GDB交叉调试环境的搭建过程,本想把交叉编译好的gdb程序放置到Qt中来进行远程调试,但是最终出现了错误。所以这里记录搭建Qt的远程调试环境的过程(没有成功),以及在命令行下使用GDB时遇到的一些问题。

Ubuntu下Qt的GDB环境搭建(未成功)

网上找到的Qt的GDB环境搭建教程很多是Qt4的GDB调试环境搭建,但是博主使用的是Qt Creator 5.6.2,所以配置也和Qt4不一样。如果是在Qt4的环境下可以参考用Qt 调用GDB调试 Arm程序 详细步骤—-可单步执行每一行,其实如果大家仔细看这篇博文,会发现这篇文章中讲述了把海思SDK中的文件移植到QtCreator的过程。所以即使GDB环境搭建不成功,(如果有需要)也可以学到如何把海思的SDK弄成Qt版的程序。

Qt5的设置

博主没有找到所谓的Start and Debug Remote Application,因为博主的菜单来汉化了一部分,所以有点坑。不过感觉是Attach to Running Debug Server..,但是我设置了服务器地址和端口,图如下所示:
0
注意:需要在构建条件中设置调试器,如图:
1
但是我设置的arm-linux-gnueabihf-gdb没有被QtCreator识别,所以也不知道是什么问题。
最终出现如下错误: Unknown debugger type "No engine" Unable to create a debugger engine of the type "No engine" 当然,偶然看到一篇博客说是因为是Ubuntu16.04 64位系统,而我的arm-linux-gnueabihf-gdb是32位的,会出现不兼容的现象,所以我安装了: apt-get install gdb-multiarch 不过,仍然是上面的错误,可能其他人能够成功吧!附【Linux开发】【Qt开发】arm-linux-gnueabihf-gdb versus gdb-multiarch 虽然知道是arm-linux-gnueabihf-gdb不被QtCreator识别,但是也不知道如何解决,希望有解决的朋友能够告知!感谢!!!

命令行调试问题记录

在命令行下调试的过程中,因为博主也没有深入去研究gdb的命令,所以只是简单讲下我理解测试过的问题。在主机端和开发板端远程连接建立后,我执行了如下命令:
第一,重复一下远程连接建立的命令: // 开发板 mount -t nfs 192.168.1.95:/nfs /opt -o nolock gdbserver 192.168.1.90:20 helloWorld // 注:开发板端是服务器端,等待主机端连接 // 主机端 arm-linux-gnueabihf-gdb helloWorld target remote 192.168.1.90:20 第二:使用gdb进行调试,gdb调试命令,博主对这些调试命令也不熟,直接附上我的gdb调试代码。 (gdb) target remote 192.168.1.90:20 // 远程连接 (gdb) file xxx // 这里是加载运行程序 (gdb) run // 运行博主的程序出现不支持run,没有研究,直接continue The "remote" target does not support "run". Try "help target" or "continue". (gdb) continue // continue是出现警告 Continuing. warning: Could not load shared library symbols for 25 libraries, e.g. /tftpboot/grape_ffmpeg/lib/libavcodec.so.57. Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"? warning: Could not load shared library symbols for 2 libraries, e.g. /tftpboot/qt5.5.1-grape/plugins/platforms/libqlinuxfb.so. Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"? 博主想要解释的就是这里的info sharedlibraryset solib-search-path
为什么会出现warning: Could not load shared library symbols for 25 libraries?这样的警告呢?,博主在网上查到很多相关的解释,很多都是复制粘贴,一笔带过,却没有说明具体的解决步骤。最后在这里:set solib-search-path command,才明白该如何使用。虽然都是英文,但是其实人家的解释真的非常非常简单。
这里翻译一下原文:
  • set solib-search-path command
    set solib-search-path用于指定GDB查找动态库文件时的目录。这个选项在gdbsever调试的使用有用。
  • syntax
set solib-search-path [Directories] show solib-search-path
  • Parameters
    1. Directories
      在Linux指定目录列表,通过(:)分隔,在Windows下使用(;)分隔,这里的目录列表就是查找符号时的动态链接库目录。
  • Typical use
    这个命令在通过gdbsever远程调试程序的时候有用。如果远端电脑和GDB电脑的共享库路径不一致,GDB不会自动的找到动态链接库和相关符号,除非使用set solib-search-path指定包含的目录。
    比如,如果你从带有GDB的电脑端复制/home/testuser/libtest/libTest.so到带有GDBServer的电脑端,命名为/tmp/libTest.so,你需要指定set solib-search-path /home/testuser/libtest,来让符号加载。
    博主记:也就是说,如果我们交叉编译的程序在开发板上指定的动态链接库的路径和在Ubuntu下的动态链接库的路径不一样,我们在电脑上使用gdb调试程序的时候,无法找到对应的开发板的动态链接库路径,毕竟远端调试没有开发板上的库路径,所有我们要在电脑端(带GDB)使用电脑端的交叉编译的库路径,指定就需要使用到set solib-search-path
  • Default value
    solib-search-path的默认值是”.”,和GDB的工作路径移植,也就是电脑端的当前目录。

总结:如果开发板端的路径和电脑端的路径不一致,我们就需要使用set solib-search-path来设置电脑端的交叉编译动态库的路径。

总结

对GDB只是简单的用了一下,本来我的问题是程序在Ubuntu下成功运行,但是在开发板上段错误,一直找不到问题,也没办法调试,因为是多线程程序,所以不太理解调试方法,这时候想到了GDB,不过后面灵机一动,解决了,果然局部变量的值传递要慎用!!!

链接地址

用Qt 调用GDB调试 Arm程序 详细步骤—-可单步执行每一行
【Linux开发】【Qt开发】arm-linux-gnueabihf-gdb versus gdb-multiarch
set solib-search-path command