参考文章
运行调试
本地调试
本地调试时,可执行文件必须自带符号表。编译时候指定
本地调试启动方式如下:gdb application (gdb) set args [arg1] [arg2] [arg3] ...
与远程调试不同的是,应用参数列表通过
set args
命令指定。- 远程调试
编译openwrt时,为了节约空间,基本都会开启strip选项。调试过程中都使用远程调试。下面时开启strip的选项。
Global build settings --->
Binary stripping method (strip) --->
( ) none
(X) strip
远程调试启动方式如下:
目标机
gdbserver :9000 application args
gdbserver为目标机上的调试服务程序。9000为服务端口。application是需要调试的应用。args为参数列表(以空格或tab键分割)。绝对路径和相对路径都可以。
pc机
./scripts/remote-gdb 192.168.13.226:9000 build_dir/[target path]/[package path]/application
pc机端运行方式比较注意。需要在openwrt的源码目录执行。192.168.13.226:9000
为目标机的地址和端口。build_dir/[target path]/[package path]/application
为没有strip的可执行文件。容易明白,这样其实是指定了执行文件的符号表。
- 库索引路径
set solib-search-path <your-path>
如果没有strip的库文件存在于其他路径。可以通过该方式指定。
调试方法
- 命令列表
※handle
使用方法 handle SIGNAL [ACTIONS]
参数说明
@SIGNAL 被关注的信号;
@ACTIONS 被关注的行为,包括”stop”, “nostop”, “print”, “noprint”,”pass”, “nopass”, “ignore”, or “noignore”。”stop”代表信号发生时,暂停应用进入gdb命令行。”print”代表信号发生时,gdb输出日志。”pass”代表传递给应用,反之被关注信号对于应用被屏蔽。”ignore”为”nopass”同义词。”noignore”为”pass”同义词。
调试技巧
- 信号处理
当应用使用了信号作为进程通信方式的时候,gdb会受信号干扰而暂停运行。这往往并不是调试者想要的。所以调试者必定想要一种自定义接收到信号之后的动作。通过handle命令可以实现调试者的目的。
默认处理方式可以通过以下两种方式获取。
info signals
info handle