源代码级调试汇编

转载 2007年09月15日 12:44:00

对喜欢ASM 的朋友来说,程序中潜在的未知错误是不可避免的也是最头痛的事情之一. 如何在ASM环境下调试程序成了整个环节中耗时很多的工作.

许多其它编译器都附带了源代码级的调试器, VC,TC大家都不会陌生, 这使得用这些高级语言调试成了一件相对easy的事情,你可以迅速进入事故现场并排除之.ASM不同,微软并没有为他提供一个集成的开发和调试环境,我们一切都得自己来!

好在我们有强大的SoftIce,这使得汇编下的调试工作变得简单,关于SICE下的源代码调试于很多文章,后面将附上罗云彬罗老的一篇介绍文章,在附带的例子里将提供Sice调试的具体实例,你要作的是修改 /hd目录下的debug.bat的内容使其指向你机器上的SICE路径,然后执行dbg.bat文件,then ok,Go!

一、TRW下的源代码调试的实现

调试的另一个选择是使用trw2000,他同样支持源代码调试.具体如何操作呢,

下载DBGLOAD插件使tr支持Coff符号调试.可从TRW的主页下载,不赘述.

首先编写一个目标程序,如win,显示一个窗口并带有一个菜单,菜单只有一项,即EXIT,在编译时打开ml的Zi选项,产生调试符号,如:

ml /c /coff /Zi win.asm

link打开两个选项:/DEBUG 和/DEBUGTYPE:CV(同时便于用SICE调试)

Link /SUBSYSTEM:.cn/ class=wordstyle>WINDOWS /DEBUG /DEBUGTYPE:CV [/MAP:win.map] win.obj res/wnd.res

呵呵,用trw2K 直接Load win.exe,trw会自动加载.pdg文件和源文件,用src调整源代码状态,终于我们在trw下也实现了源代码级调试,酷吧!

注:/MAP:win.map可不选,这里主要是为了说明下面的符号调试

附:关于mapsym的符号调试

下面用Mapsym转化.map-->.sym

mapsym.exe -ms win.map

MAPSYM是用来把链接产生的.map文件转化为tr可用的.sym文件.参数格式如下:

Usage: -> Mapsym [-nologo] [-almnst] [-c pefile] -o outfile] infile

-a include alphebatic sort arrays
-l list map file information
-e edit symbols for NTSD parser
-m use module name from infile
-n omit line number information
-nologo omit signon logo
-o outfile symbol outputfile
-s enable line number support [default]
-t include static symbols


这个文件在DDK里,如果你没有DDK可在我主页软件资源找到下载,例子里面已经内含.



按照trw的说明书如果包含行号的话,应该可以加载原文件而实现源代码调试,可惜试验未能成功,只能进行符号调试,哪位成功请指点一二.



附:二、SoftIce下的源代码调试的实现 (Author:罗云彬)
.cn/ class=wordstyle>Windows 编程中,Soft-ICE 是一件必不可少的调试工具,但 .cn/ class=wordstyle>Windows 程序的编程中有很多的时候是和数据结构和 API 打交道,经过编译以后,原来的 mov stRect.left,eax 之类的代码也就变成了 mov [xxxx],eax,invoke UpdateWindow,hWnd 之类的语句也就变成了 push [xxxx]/call [xxxxx] 之类的语句,如果你不记的源程序了,你就根本无法知道你在向什么数据写或者调用什么 API,在 C++ 编程的时候,我们都可以进行源代码级别的跟踪调试,但在汇编中,这可能吗?


答案是可以的,用 Soft-ICE 就可以实现,本文讨论使用 Masm 的情况下用 Soft-ICE 实现源码调试,具体的实现如下:

首先,在编译的时候要生成带符号信息的 Object 文件,这需要打开 ML 程序的两个选项
ML /coff /Zi ...
/coff 告诉编译器产生符号调试格式的 Object 文件。
/Zi 使 Object 文件中包括符号调试信息。
然后也要设置 Link 文件,因为 Soft-ICE 使用 CodeView 格式的调试信息,所以 Link 也要包括下面的选项
Link /DEBUG /DEBUGTYPE:CV ...
/DEBUG 选项告诉 Link 在 exe 文件中包含调试信息。
/DEBUGTYPE:CV 当然是调试信息要用 CodeView 格式啦。
最后,就是如何使用 Soft-ICE 了,如果要使用符号调试功能,你不能再用 Loader32.exe 程序来装入 exe 文件,而是必须用符号转换程序 nmsym,使用方法是在命令行中打入 nmsym /translate:source,package,always /source:. /load:execute,break 你的exe文件,你可以把它编写成一个 bat 文件如下 nmsym /translate:source,package,always /source:. /load:execute,break %1,假定文件名为 debug.bat ,然后你就可以用 debug xxx.exe 来享受源代码调试的乐趣了。
别的一些必要的设置:你必须把 Soft-ICE 的目录和 Masm 的 bin 目录设置到 path 中,因为这些路径中还有些文件要用到。  

功能强大的源码级调试器--gdb

第一步:编译源程序,-g选项告诉编译器生成调试信息 例: gcc hello.c -g 第二步:运行gdb 例: gdb a.out 一般操作 -l 查看源码 b n 在第n行设置断点 ...

c++ 调试过程中 “没有可用于当前位置的源代码” 和 总是出现反汇编窗口的 解决方案

1> 如何关掉反汇编窗口 工具-》选项-》调试 取消 “地址级调试”前面的勾选 2>项目不包含所要查看的源代码的原因: 项目不包含您试图查看代码的源代码。原因通常是双击了“调用堆栈”窗口或“...

8086汇编 贪吃蛇 源代码

assume cs:code,ds:data,ss:stack data segment  dw 200 dup(0) ;--蛇身坐标  dw 0,0,0  ;--存储原始9号中断 data ...

一个源代码与反汇编代码对照的例子

如下的C++代码,对应的汇编代码会是什么样子呢?   #include int Addemup(int,int); void main(void) { int x = 5...

8086汇编基础 用debug加载程序后,可以使用u命令查看源代码

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 也可当前地址加上CX寄存器,就可以得到程序的全部代码...

汇编 字符串输入输出 源代码及详细解释

DATAS  SEGMENT      ;segment和ends是成对使用的伪指令,功能是定义一个段,这是在写可被编译器编译的汇编程序时 ;必须使用的,sement是段的开始,ends是结束 b...

基于visual c++之windows核心编程代码分析(53)在C++中嵌入汇编实现DLL注入源代码

我们在C++编程的时候,有些时候获取更大编程余地,以及为了缩减代码,经常使用插入汇编语言进行联合编程。下面我们实践在C++中嵌入汇编实现DLL注入源代码。DLL动态函数链接库的接口如下。#includ...

8086汇编 贪吃蛇 源代码

assume cs:code,ds:data,ss:stack data segment  dw 200 dup(0) ;--蛇身坐标  dw 0,0,0  ;--存储原始9号中断 dat...
  • csshuke
  • csshuke
  • 2016年10月24日 10:19
  • 133

汇编原理2: 源代码开始

;使用masm5.0进行编译 ;程序功能:在屏幕上显示一行字符串. ;注意:使用masm5.编译asm文件的时候,文件名长度不要超过8个字符,否则会无法打开文件. assume cs:code c...

Minix源代码中的汇编

THE MINIX ASSEMBLY LANGUAGE MANUAL(minix汇编语言手册) 感觉还能看懂就给贴上来了,这编文章还是挺不错的呵呵!有待研究 THE MINIX ASSEM...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:源代码级调试汇编
举报原因:
原因补充:

(最多只允许输入30个字)