两个步骤完成后,便可以使用 GDB 进行调试了
GDB 依靠 CPU 的陷阱机制来进行调试,需要能够捕获陷阱。
若有硬件调试工具的存在,因为硬件调试工具会也会捕获陷阱,因此使用 GDB 时,需要首先断开硬件调试工具的连接。
以 SPARC 架构处理器常用的 GRMON 硬件调试工具为例,使用如下的操作断开 GRMON 的连接:
以下几点需要注意:
debug CONNECT_OPTIONS PROGRAM ARGUMENTS... debug --attach CONNECT_OPTIONS PID |
第一行用于启动程序调试。第二行用于附加到进程。
CONNECT_OPTIONS
PROGRAM
ARGUMENTS...
CONNECT_OPTIONS
PID
debug :1234 /apps/helloworld
debug terminal /apps/helloworld -c 100
debug --attach /dev/ttyS3 2
以 SPARC 工具链的 GDB 举例,使用下面的命令启动 PC 上的 GDB 工具:
sparc-sylixos-elf-gdb.exe D:\workspace\helloworld\Debug\helloworld |
命令行参数,是待调试的程序二进制文件路径。这里需要选择非 Strip 的版本。
使用下面的命令连接到 SylixOS 上的 GDB Server:
(gdb) target remote 10.12.0.167:1234 (gdb) target remote COM3 |
第一行用于网络调试,10.12.0.167 是板卡 IP,1234 是 GDB Server 端口号。
第二行用于串口调试,COM3 是调试用的串口。(GDB 仅支持 COM1-COM9,COM10(含)以上,请更改串口号到 1-9)
SylixOS 应用程序会有依赖的动态库,如至少依赖 libvpmpdm.so。若要在 GDB 中能够跟踪到动态库内的代码,则必须设置库搜索路径。
假设待调试的程序,依赖一个动态库 libabc.so,动态库的二进制文件位于 “D:\workspace\libabc\Debug\libabc.so”,使用下面的命令设置库搜索路径:
(gdb) set solib-search-path D:\workspace\sylixos-base\libsylixos\Debug;D:\workspace\libabc\Debug |
set solib-search-path 命令如果多次执行,后设置的搜索路径,会覆盖先前设置的路径。因此若要设置多个路径,则应该像上面一样,将多个路径用英文分号 “;” 隔开。
如上面所示,设置了两个搜索路径:
这代表 PC 上的 GDB 工具并不知道待调试的程序。无法解析符号。
请检查 PC 上启动 GDB 程序的时候,命令行参数有没有传入非 Strip 版本的二进制文件路径。
若动态库的链接,是在程序编译时使用 -l 指定,请检查程序编译时,是否链接了这个依赖库。
若动态库的链接,是调用 dlopen(),在程序运行时链接的,则程序必须在执行了 dlopen() 函数后,才能在 info sharedlibrary 中看到链接的库。
若程序还没有运行到 dlopen() 函数的位置,info sharedlibrary 中就看不到应用程序的依赖库。
请检查库搜索路径是否正确配置。若要配置多个库搜索路径,请将多个路径合并成一个字符串,中间用英文分号隔开。
请不要多次执行 set solib-search-path 命令,因为后执行的命令会覆盖先前设置的路径,而不是追加一个新的搜索路径。