Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2358749
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-03-10 02:34:42

在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) |
给主人留下些什么吧!~~