使用
“调用堆栈”
窗口可以查看当前堆栈上的函数或过程调用。
“调用堆栈”
窗口显示每个函数的名称以及编写它所用的编程语言。
函数或过程名称可能包含可选信息,如模块名称、行号、参数名称、类型和值。
可以打开或关闭这些可选信息的显示。
一个黄色箭头标识执行指针当前所位于的堆栈帧。
默认情况下,该帧的信息显示在源、
“反汇编”
、
“局部变量”
、
“监视”
和
“自动”
窗口中。
如果想将上下文更改为堆栈上的另一个帧,可以在
“调用堆栈”
窗口中执行相应的操作。
当调试符号对部分调用堆栈不可用时,
“调用堆栈”
窗口也许就不能显示那部分调用堆栈的正确信息。
将出现以下表示法:
[下面的帧可能不正确和/或缺失,没有为 name.dll 加载符号]
在托管代码中,默认情况下,
“调用堆栈”
窗口将隐藏非用户代码的信息。
在隐藏信息处出现以下表示法:
[<External Code>]
非用户代码是任何代码,这些代码不是可通过快捷菜单选择以显示非用户代码的调用堆栈信息的我的代码。
可以使用快捷菜单选择查看线程之间的调用。
以中断模式或运行模式显示“调用堆栈”窗口
更改显示的可选信息
在“调用堆栈”窗口中显示非用户代码帧
切换到另一个堆栈帧
-
在
“调用堆栈”
窗口中,右击要查看其代码和数据的帧。
-
选择
“切换到帧”
。
一个带有卷尾的绿色箭头显示在所选帧旁。
执行指针保留在原始帧中,仍然用黄色箭头标记。
如果从
“调试”
菜单中选择
“单步执行”
或
“继续”
,执行将继续在原始帧中进行,而不是在选定的帧中进行。
显示与其他线程之间的来回调用
查看调用堆栈上的函数的源代码
直观地跟踪调用堆栈
查看调用堆栈上的函数的反汇编代码
从“调用堆栈”窗口运行到特定函数
在函数调用的退出点上设置断点
加载模块符号
在
“调用堆栈”
窗口中,可以为当前还未加载符号的代码加载调试符号。
这些符号可以是从 Microsoft 公共符号服务器下载的 .NET Framework 符号或系统符号,也可以是正在调试的计算机上的某个符号路径中的符号。
请参阅
在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
-
在
“调用堆栈”
窗口中,右击尚未为其加载符号的帧。
此帧将显示为灰色。
-
指向
“加载符号”
,然后单击
“Microsoft 符号服务器”
或
“符号路径”
。
设置符号路径
-
在
“调用堆栈”
窗口中,从快捷菜单中选择
“符号设置”
。
将打开
“选项”
对话框并显示
“符号”
页。
-
单击
“符号设置”
。
-
在
“选项”
对话框中单击“文件夹”图标。
在
“符号文件(.pdb)位置”
框中将出现一个光标。
-
键入所调试的计算机上的符号位置的目录路径名。
对于本地调试,此计算机指您的本地计算机。
对于远程调试,此计算机指远程计算机。
-
单击
“确定”
关闭
“选项”
对话框。
原文及英文请查看:http://msdn.microsoft.com/zh-cn/library/a3694ts5.aspx
调试是软件开发周期中很重要的一部分。它具有挑战性,同时也很让人疑惑和烦恼。总的来说,对于稍大一点的程序,调试是不可避免的。最近几年,调试工具的发展让很多调试任务变的越来越简单和省时。
1 悬停鼠标
查看
表达式值
调试是很有挑战性的。比如在函数内逐步运行可以看出哪里出错,
查看
堆栈
信息可以知道函数被谁
调用
等等。
但是无论哪种情况下,
查看
表达式和局部变量的值都是很麻烦的(把表达式和局部变量放到watch
窗口
里)。
一种更简单的方法,把鼠标停在所需
查看
的数据上。如果是类或结构,那么点击展开可以很方便快速地
查看
其字段。
2 在运行过程中改变变量值
调试器不仅仅是分析程序崩溃和诡异行为的
我们知道在Linux环境下
使用
gdb调试程序时,可以方便的
使用
bt命令打印出程序
堆栈
,方便了解函数
调用
堆栈
,定位问题;那么在
使用
Visual
Studio
开发工具进行C/C++程序调试时,如何
查看
堆栈
呢?
图形化的VS开发工具更方便我们
查看
程序运行
堆栈
,在程序进行Debug时,选择Debug菜单栏,进入Windows子项;然后继续进入Call Stack项,打开
堆栈
窗口
...
OllyDbg发行版是一个ZIP压缩包,只要解压运行OllyDbg.exe即可。运行OllyDbg打开进程,主
窗口
显示反汇编清单。各
窗口
的外观属性如:“标题栏(bar)、字体(font)”等在右键菜单"界面选项(appearance)"里控制
1.代码
窗口
代码
窗口
(OllyDbg帮助文件自称反编汇
窗口
)显示被调试程序的代码。他有四个列 地址/Address(虚拟地址) HEX 数据/HEX dump(机器码) 反编汇/Diassassembly(汇编代码) 注释/Comment(注释) 最后一列注释(Comment)显示相关API参数或运行简表,非常有用,有点类似于IDA Pro。 在代码
窗口
(地址行,不是列标题)双击时完成动作。 ●地址(Address)列:显示相对被双击地址的地址,再次双击返回标准地址模式; ●HEX 数据(HEX dump)列:设置或取消无条件断点,按F2键也能设置断点; ●反编汇(Diassassembly)列:调试编辑器,可直接修改汇编代码; ●注释(Comment)列:允许增加或编辑注释。 代码
窗口
允许浏览、分析、搜索和修改代码,保存改变到可执行文件,设置断点等。相关弹出式菜单包括100多项。
2.信息
窗口
(Information window)
动态跟踪时,与指令相关的各寄存器的值、API函数
调用
提示、跳转提示等信息显示。
3.数据
窗口
以十六进制或内存方式显示文件在内容中的数据,类似于softICE的数据
窗口
。要显示数据可单击右键"转到→表达式(Go to→expression)"或按Ctrl+G键打开地址
窗口
,输入地址。
4.寄存器(Registers window)
显示CPU各寄存器的值,支持浮点(FPU)、MMX,3DNow!寄存器,可以单击鼠标右键切换。
5.
堆栈
窗口
(Stack window)
堆栈
窗口
非常重要,各API函数、子程序等都利用它传递参数、变量等。OllyDbg
堆栈
窗口
功能强大。如果传递的参数都是字符串,OllyDbg会在注释里直接将其显示出来,再也不用像SoftICE那样经常用D命令
查看
内存数据了。
调用
堆栈
窗口
的重要功能是:可以找到当前函数的
调用
函数,以及依次往前的每一级
调用
函数。
调用
堆栈
窗口
会按照函数的
调用
顺序来显示,
窗口
中顶部为栈顶,底部为栈底,栈底的函数最先被
调用
,每个函数
调用
称为帧,即栈帧,
调用
堆栈
由一帧帧函数组成,其中的信息无法手动修改,如名称,路径,符号状态等,但可以通过设置控制器是否显示在
窗口
中。
调用
堆栈
窗口
中排列着一组函数信息,内容主体是个函数栈,最上面的函数,就是第一级函数,是最后被
调用
的