约有 1,303 项符合查询结果, 以下是第 121 - 131项。
费时 < 1 秒。
ZXH,
Continue选项只对异常类事件有意义(参见《软件调试》30.9.3节,P48)。
在WinDBG中可以直接使用ed命令来编辑_crtBreakAlloc变量(《软件调试》P698),例如你要编辑静态链接到myapp.exe中的CRT实例,那么便执行:ed myapp!__crtBreakAlloc 。
Posted in WinDbg
by
格蠹老雷
on 2008-08-07
在符号文件中,可以为每个源文件保存一个校验和。然后用这个校验和来严格校验源文件是否匹配。但是实际上,目前的编译器/链接器并没有这么做。也就是源文件的校验和字段都是0,使用SymView工具打开一个私有PDB文件,可以清楚的观察到这一现象。
因此,大多数情况下,调试器无法校验源文件是否严格匹配,只要在源文件路径中找到名称匹配的文件便使用它。这就要求调试者要心中有数。
举例来说,如果把《软件调试》第13.4节所讨论例子中的realbug.c在中间加几个空行,然后再用WinDBG来分析(!analyze),那么它就会把错误行的箭头指到错误的位置(赋值语句),正确的应该是除法操作那一行(清单13-5)。
FOLLOWUP_IP:
RealBug!PropDivideZero+3f ...
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-07
1)如果你觉得main/winmain入口还不够早,那么可以使用WinDBG,在进程的初始断点命中后,启用模块加载事件(debug > event filters > load module),然后在每个CRT DLL加载后设置序号断点。
2)被调试进程中可能有几个CRT实例,应该修改所有实例的_crtBreakAlloc变量,才能保证不会遗漏。以myapp.exe为例,myapp内可能有一份静态链接进来的CRT,即myapp!_crtBreakAlloc。而MSVCRT60.DLL这样的模块中也有CRT实例。
手语说的在Win32堆这一层次来分析也是可行的,而且把握更大,但是就要求你先要熟悉一下Win32堆的常识,《软件调试》23章的前10节做了详细的介绍。
Posted in WinDbg
by
格蠹老雷
on 2008-08-05
《软件调试》的702页介绍了堆块转储的细节,取其中的一个堆块为例:
{137} normal block at 0x01073790, 8 bytes long.
Data: <H7> 48 37 07 01 CD CD CD CD
137是堆块的分配序号,堆块的类型为普通堆块,位置为0x01073790,用户区长度为8字节。
Data后为用户数据区的前16字节,因为这个数据区只有8字节,所以即所有8字节。<H7>是这8字节的ASCII码显示(其它6字节为不可显示的ASCII码)。其中的CD CD CD CD ...
Posted in WinDbg
by
格蠹老雷
on 2008-08-04
1)你能把你看到的转储信息(Dump)复制一些过来么?
2)如果你有《软件调试》这本书,那么请阅读一下第23章,特别是以下几个小节:
23.7.2 DH和UMDH工具 668
23.7.3 定位内存泄漏 668
23.14 堆块转储 700
23.15 泄漏转储 704
23.15.1 _CrtDumpMemoryLeaks 704
23.15.2 何时调用 705
23.15.3 定位导致泄漏的源代码 706
Posted in WinDbg
by
格蠹老雷
on 2008-08-04
没有,我前面关于PatchGuard的猜测是错误的,实际上是因为启用了PAE。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-02
lm (WinDBG中的著名命令呀^_^),
多谢你的反馈。软件调试这个题目很大,可借鉴的东西少。一边要探索技术难题,一边要编写工具和示例,一边还要顾及篇章结构。最重要的是,我们不比职业作者呀,只能用业余时间。所以,这一版本的内容一定是有不尽意之处呀。但愿有机会出第二版,可以改进完善。很愿意听你的高见。
Posted in 《软件调试》书友
by
格蠹老雷
on 2008-08-02
SHL,
那么就很正常了呀。像下面这样理解,你也许就明白了。
记录和报告异常是CPU的两种动作,LBR位用来让CPU把分支记录到LBR栈(环形寄存器缓冲区)中。BTF+TF位让CPU遇到分支时产生异常。
但以下两点值得注意:
1)LBR和BTF位是在MSR寄存器中的,TF位是在标志寄存器中的。在目前的操作系统(Windows等)实现中,MSR寄存器是全局的,标记寄存器是线程相关的。也就是说,当CPU切换线程时,并不保存和恢复MSR寄存器的内容,但却保存和恢复标志寄存器的内容。
2)TF和BTF位都是会被CPU自动清除的,也就是当CPU因为这两位而产生一次异常后,会自动将它们清除(《软件调试》96页)。这样做的原因也很明显,如果不清除,那么从分发和处理异常的代码便会不停再导致异常,C ...
Posted in 《软件调试》的示例程序
by
格蠹老雷
on 2008-08-02
SHL和FORGOT,
根据你们的描述,感觉是在中断触发(INT 1)下读取LBR寄存器。没有中断发生时,你们是怎么读取LBR寄存器的呢?另外,你们是怎么判断CPU没有记录分支呢?从LBR寄存器读出的是什么内容?
Posted in 《软件调试》的示例程序
by
格蠹老雷
on 2008-08-01
SHL,
仔细检查一下你的代码,看是不是有编码问题。我在我的机器上做了个试验,同时启用LBR和BTF,没有跟踪,LBR寄存器还是在不停记录呀。
lkd> wrmsr 1d9 3 [设置LBR和BTF位]
lkd> rdmsr 1d9
msr[1d9] = 00000000`00000003 【读回来看,验证】
lkd> rdmsr 1c9
msr[1c9] = 00000000`08000006 【读TOS寄存器】
lkd> rdmsr 1c9
msr[1c9] = 00000000`08000000 【再读TOS寄存器,看其在变】
lkd> rdmsr 1c9
msr[1c9] = ...
Posted in 《软件调试》的示例程序
by
格蠹老雷
on 2008-07-31