- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC 调试器高级应用 高级断点篇
CND8 学院 VC 教程 发布日期:2008 年 12 月 15 日
VC 调试器高级应用 高级断点篇
一.高级断点语法
高级断点语法由两部分组成:1.上下文部分.2.位置,表达式,变量或Windows 消息条件.
用函数,源文件和二进制模块来指定上下文,上下文的表示方法:
{[函数],[源文件],[二进制模块]}
必须指定唯一的,足够的上下文信息才能获取断点位置.如在 TEST.CPP 的 20 行设一位置断点,语法为:{,TEST.CPP,}.20,如A.DLL 或B.DLL 都使用了该行,又只想在B.DLL 的调用中触发,则必须使
用:{,TEST.CPP,B.DLL}.20.
VC 调试器中可直接输入上下文语法:Breakpoints 对话框的Location 选项卡BreakAt 编辑框中.更容易的方法是使用BreatAt 框右的箭头打开菜单,选择Advanced 项,然后在Context 框中输入断点的相应信息.
如想在一个绝对地址上中断,直接在BreakAt 框中输入地址就行.
二.任何函数上快速中断
将函数名输入BreadAt 框中.如果是C++代码,同时还需要类限定符.支持重载了的函数,调试器会列出所有满足条件的函数供选择,如输入时提供足够的信息,完全可略过选择过程.如输
入:CString::operator=(const char *)可唯一确定要中断的函数.
三.在系统或DLL 输出的函数中设置断点
在程序中从DLL 输入的函数中设置一个断点可能是毫无作用的,调试器需要知道在何处可以找到该函数上下文信息,同时,函数名取决于是否加载了DLL 的符号.只有在W2K 以上版本中才能在系统DLL 中设置断点--
原因在于其它系统没有提供边写入边复制保护的功能,若一定要启用这种方法,必须要有 COFF(Common Object File Format),并在调试器中输出启动的装载 在Options 对话框的Debug 页,将
Load COFF Exports选中.
VC 调试器用分级的符号信息法,完整的符号的级别高于不太完整的.PDB(Program Database)文件具有所有可能的源码行,函数,变量和类型信息,优先级便高于 COFF/DBG 文件,后者只有公用函数符号,而COFF/DBG
文件高于输出名称,输入的名称是一种伪符号.
调试时,如DEBUG 窗口输出:装载DLL 的符号,则说明符号已被装入;否则说明没有装载DLL 的符号.
没有装入符号时,使用的位置字符串是DLL 输出的名称,可能用DUMPBIN 程序查看这个名称:DUMPBIN /EXPORTS DLLname.例:在 LoadLibraryA 中设置中断:{,,Kernel32.dll}LoadLibraryA.
如装入了符号,则要根据输出函数和调用协议来计算函数名.如上例,LoadLibraryA 使用 stdcall 调用协议,据该协议,函数名以下划线为前缀,所跟有进栈的字节数为后缀的@号.一般说来,参数个数*4,就是参数占
用栈空间的总字节数,LoadLibary 的名称便是:_LoadLibraryA@4,故最后的语法是:或{,,Kernel32.dll}_LoadLibraryA@4
附:常用的调用协议
1、 stdcall 调用约定相当于16 位动态库中经常使用的PASCAL 调用约定。在 32 位的VC++5.0 中PASCAL 调用约定不再被支持(实际上它已被定义为 stdcall。除了 pascal 外, fortran 和 syscall
也不被支持),取而代之的是 stdcall 调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部
分在后面将详细说明)。
_stdcall 是Pascal 程序的缺省调用方式,通常用于Win32 Api 中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC 将函数编译后会在函数名前面加上下划线前缀,在函数名后加上@和参数
的字节数。
2、C 调用约定(即用 cdecl 关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。
另外,在函数名修饰约定方面也有所不同。
_cdecl 是C 和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall 函数的大。函数采用从右到左的压栈方式。VC 将函数编译后会在函
数名前面加上下划线前缀。是MFC 缺省调用约定。
3、 fastcall
文档评论(0)