约有 1,303 项符合查询结果, 以下是第 119 - 131项。
费时 < 1 秒。
Coding,
WinDBG提示什么错误呢?是的WinDBG帮助中没有仔细介绍EXDI方式。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-23
如果你想粗略估计经历哪些跳转才执行你的中断处理函数,那么可以使用CPU的LBR(Last Branch Recording)功能,观察LBR寄存器,《软件调试》书中实现了一个扩展命令(lbr.lbr)(110~113页)。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-22
理论上,利用CPU的中断、异常和分支记录功能可以实现这个目标。但是具体操作起来还是有些麻烦,借助INTEL的vTune工具应该可以观察到。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-20
dos,
你的最后两句话离答案已经很近了。其实使用WinDBG或者VS观察一下汇编代码,答案就有了。
下面是没有MessageBox时,OnBnClickedException函数的代码:
TestThrowDll!CTestThrowDllDlg::OnBnClickedException:00401460 6a01 push 100401462 e837000000 call ...
Posted in C/C++本地代码调试
by
格蠹老雷
on 2008-08-20
dos,
我很愿意看一下你的试验代码,你可以发到我的信箱中:yinkui.zhang@gmail.com
Posted in C/C++本地代码调试
by
格蠹老雷
on 2008-08-20
很明显是个空指针的问题。出问题的是下面的指令:
mov si,word ptr [eax+edx*2+10h]
翻译成高级语言,它就是p->Field[X]这个样子,而目前EAX=0,也就是p=0.
目前的栈回溯因为没有调试符号,没有提供很有效的信息。
如果想继续探索根源,那么建议使用内核调试方法做live kernel debugging。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-19
dos,
仔细读一下《软件调试》576页-577页上方的描述,你就会明白了。
简单来说,在有调试器的时候,确实会有异常发生,也就是被调试进程中的CRT与调试器通信的异常,但是这个异常会先发送给调试器(《软件调试》P945),而且VC调试器会宣布处理它,所以你的try{}catch()就catch不到了。
当没有被调试时,CRT的错误报告函数不再会抛出异常。
CRT使用的异常代码是很特殊的代码,VC是可以识别的,因此上面的逻辑不会影响你用throw关键字抛出的异常。
Posted in C/C++本地代码调试
by
格蠹老雷
on 2008-08-19
问题1,其实你可以在错误框弹出时,将被调试程序中断到调试器(在WinDBG中按Ctrl+Break,在VC菜单中选Break),然后观察每个线程的栈回溯。上面这个错误应该是同步的,所以应该可以从栈回溯中看到线索。
问题2,这个运行期错应该就是运行库检查到不合适的用法后,直接弹出错误框,我推测它就是个普通的:
if(something error)
{
msgbox(...);
}
根本没有异常发生。当然,报告运行期错误的过程要经历很多步骤(参考《软件调试》的清单21-12)。
问题3,对于这个问题在错误框弹出时,做DUMP来得及,打开DUMP后,首先设置好符号后,可以使用~* kPL命令来显示各个线程的栈回溯,然后找到错误框所在的线程,分析其来龙去脉。
Posted in C/C++本地代码调试
by
格蠹老雷
on 2008-08-18
首先,u命令是可以在没有符号的情况下工作的,前提是你知道要反汇编代码的内存地址。举例来说,你如果只知道函数名,希望使用u mydrv!myfunc这样的命令来反汇编,那么需要符号,但是如果你知道myfunc函数的地址,那么当然可以直接使用u 的方法。
完整转储保存的是物理内存的内容,如果你的代码是Pagable(可交换的),那么它可能被交换到硬盘上的pagefile中,这就有可能不被包含在转储文件中了。
建议你还是使用内存观察命令和直接放汇编地址的方法试验一下,如果还有问题,最好把你的做的过程描述一下(paste些关键细节)。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-18
王宇说的很对。我再详细解释一下。这个蓝屏代码的确容易让人困惑,其实它在本例中的含义是在当前的高IRQL下不能产生Page Fault,但事实上那条mov指令引用了空指针,因而产生了Page Fault。当前的IRQL很高,有产生了Page Fault,所以就只能Stop了。
从上面信息看到,这条MOV指令是在NT内核的自己代码中,这一点是可信的。但是目前显示的栈回溯很不完整,建议你首先要设置好调试符号,目前连你自己的Freezer驱动(是你自己的吧)都没有符号。正确的调试符号很重要。
Posted in Windows内核调试
by
格蠹老雷
on 2008-08-18