到gdb的官方站点:https://www.gnu.org/software/gdb/current/
(gdb代码托管在这里:git clone git://sourceware.org/git/binutils-gdb.git )
找到它的Bug database:https://sourceware.org/bugzilla/
搜索到一个相关的patch:https://sourceware.org/bugzilla/show_bug.cgi?id=13984
1. 下载gdb 7.12版本的源码
2. 验证7.12是否存在该问题
为了不与原本安装的gdb冲突,configure时指定make install的路径 “./configure --prefix=/home/luzeshu/tools/gdb-7.12” “make” “make install” 重复上面几个step,发现7.12一样有该问题。
3. 解决 方法1: 按照上面的patch,修改源码。
方法2(版本7.9): 如果下载了7.9的源码,可以把patch保存成“fix-remote.patch”文件,直接用“patch < fix-remote.patch” 打补丁。 如果出现下面错误,或许是空格的问题,给patch命令加上 --ignore-whitespace
patching file remote.c Hunk #1 FAILED at 6154. 1 out of 1 hunk FAILED -- saving rejects to file remote.c.rej方法2(版本7.12): 用7.12版本的,同样可以用上面的patch文件,不过line number要把6154改成7.12版对应的line number。
改完代码,再重新编译安装。再重复上面几个step,解决了。
6. gdb set architecture最后一点,执行完lret切换到长模式之后,需要通过“set architecture i386:x86-64:intel”给gdb设置成64位。如果CPU进入长模式,而GDB没有跟着设置,显示的信息都是错乱的。 这里猜想是gdb所处的模式(32位或64位)对报文数据解读出的差错。
GDB+GDBserver无源码调试Android 动态链接库的技巧
使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境)
在Ubuntu上用GDB调试printf源码