GDB启动时未执行命令文件中指令的问题咨询
-x指定的命令文件? 我把GDB启动时要自动执行的命令写到了/root/gdbst.gdb文件里,文件内容如下:
cat /root/gdbst.gdb file /root/centos-6.3-x86_64/abc dir /root/centos-6.3-x86_64/dir/abcdir target extended-remote 192.168.0.180:1234
接着执行启动命令:
gdb -x /root/gdbst.gdb
结果GDB启动后完全没执行这些预设命令,只输出了默认的版权和配置信息,直接停在了(gdb)提示符:
root@ubuntu:~# gdb -x /root/gdbst.gdb GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 [版权及配置信息省略] (gdb)
我查过文件权限,是-rwxrwxr-x 1 root root 236 Jan 24 03:16 gdbst.gdb,完全没问题。但如果在GDB命令行里手动执行source -v /root/gdbst.gdb,这些命令就能正常跑起来:
(gdb) source -v /root/gdbst.gdb +file /root/centos-6.3-x86_64/abc +dir /root/centos-6.3-x86_64/dir/abcdir +target extended-remote 192.168.0.180:1234
手动输入这些命令也能正常实现加载指定文件、设置源码目录并连接远程gdbserver的效果,为啥用-x参数启动GDB就完全忽略命令文件呢?
我遇到过类似的情况,给你几个排查方向:
先排除默认初始化文件的干扰:GDB启动时会优先读取
~/.gdbinit这类默认初始化文件,如果里面有set auto-load safe-path或者其他限制路径的配置,可能会阻止自动加载/root下的命令文件。你可以试试启动时加上-n参数,跳过默认初始化文件:gdb -n -x /root/gdbst.gdb检查命令文件的换行符格式:如果你的
gdbst.gdb是在Windows环境下创建的,换行符是CRLF(也就是每行结尾有^M),而Linux下的GDB只认LF换行,这就会导致GDB解析失败。用cat -A /root/gdbst.gdb查看,如果看到每行结尾有^M$,就用dos2unix /root/gdbst.gdb转换格式试试。换用长参数
--command试试:有些老版本GDB对短参数-x的处理可能有小bug,换成长参数说不定能解决:gdb --command=/root/gdbst.gdb考虑GDB版本的问题:你用的是Ubuntu 16.04自带的GDB 7.11.1,这个版本确实存在一些命令文件加载的已知问题。如果上面的方法都没用,可以尝试升级GDB到更高版本,或者如果是跨架构调试的话,换成
gdb-multiarch试试。
内容的提问来源于stack exchange,提问作者Fyodor Yemelyanenko

