在VS.NET的可视化调试环境下, 程序的反汇编输出与源代码行是混合在一起的, 一行源代码, 接下来是这一行源代码对应的汇编指令, 很直观.
仔细调校gcc 的选项, 也可以生成类似的格式
gcc -g -Wa,-alhs=test.s -fverbose-asm test.c
但上面的命令生成的仅止于静态的代码, 而不是程序实际运行起来后经过loader 修改后的指令.
gdb的调试环境中, disassemble 命令的输出却是干巴巴地直接把指令丢出来.
一番苦思之后, 我调试出下面的自定义gdb 命令可以实现上述功能, 让源码与汇编输出直观上看起来就有明显的对应关系, 参数是两个行号
disline 7 9
就会显示第7到第9行, 不包括第9行的汇编输出
代码如下:
define disline
set var $i=$arg0
set logging file ~/gdb.txt
set logging overwrite on
set logging redirect on
while $i < $arg1
set logging on
info line $i
set logging off
shell sed 's/.*\(starts\|ends\) at \(address \)\?\([^ ]*\).*/set var $\1=\3/g;$a\'$'\n''disass $starts $ends' gdb.txt > gdb_script.txt
printf "Line %04d: ", $i
list $i,$i
source gdb_script.txt
set var $i=$i+1
end
end
以上代码还需要调整, 以处理有些代码行不对应任何指令的情况.
阅读(1881) | 评论(0) | 转发(0) |