【问题标题】:Vista 64 bit BSOD when running a Delphi 2009 Application运行 Delphi 2009 应用程序时 Vista 64 位蓝屏
【发布时间】:2010-11-16 13:36:36
【问题描述】:

我有一个已转换为 Delphi 2009 的应用程序我有“字符串格式检查”和标准内存管理器。我在http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx 下载了 MS 调试工具并获得了一些调试文件,但我不知道该怎么做。我想要一些关于从这里去哪里的指示。下面是调试文件的顶部(底部已加载所有驱动程序);

打开的日志文件 'c:\debuglog.txt' 1:kd> .sympath srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols 符号搜索路径为:srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols 扩展符号搜索路径为:srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols 1: kd> .reload;!分析-v;r;kv;lmnt;.logclose;q 加载内核符号 ..................................................... ...... ..................................................... ..................... ………………………………………………………………………………………………………… 加载用户符号 加载卸载的模块列表 ........... ****************************************************** ***************************** * * *错误检查分析* * * ****************************************************** ***************************** UNEXPECTED_KERNEL_MODE_TRAP (7f) 这意味着在内核模式中发生了一个陷阱,它是一种陷阱 不允许内核拥有/捕获(绑定陷阱)或 总是立即死亡(双重错误)。中的第一个数字 bugcheck 参数是陷阱的数量(8 = 双重错误等) 请查阅 Intel x86 系列手册以了解有关这些内容的更多信息 陷阱是。这是这些代码的*部分*: 如果 kv 显示 taskGate 在冒号之前的部分使用 .tss,然后是 kv。 否则,如果 kv 显示陷阱框 在该值上使用 .trap 别的 .trap 在适当的框架上将显示陷阱的位置 (在 x86 上,这将是 KiTrap 程序附带的 ebp) 万一 然后 kb 将显示更正后的堆栈。 论据: Arg1:0000000000000008,EXCEPTION_DOUBLE_FAULT Arg2:0000000080050033 Arg3:00000000000006f8 Arg4: fffff80001ee1678 调试细节: ------------------ BUGCHECK_STR:0x7f_8 CUSTOMER_CRASH_COUNT: 4 DEFAULT_BUCKET_ID:COMMON_SYSTEM_FAULT PROCESS_NAME:SomeApplication.e 当前_IRQL:1 异常记录:fffffa60087b43c8 -- (.exr 0xfffffa60087b43c8) .exr 0xfffffa60087b43c8 异常地址:fffff80001ed0150 (nt!RtlVirtualUnwind+0x0000000000000250) 异常代码:10000004 异常标志:00000000 数量参数:2 参数[0]:0000000000000000 参数[1]:00000000000000d8 TRAP_FRAME: fffffa60087b4470 -- (.trap 0xfffffa60087b4470) .trap 0xfffffa60087b4470 注意:陷阱帧不包含所有寄存器。 某些寄存器值可能为零或不正确。 rax=0000000000000050 rbx=0000000000000000 rcx=0000000000000004 rdx=00000000000000d8 rsi=0000000000000000 rdi=0000000000000000 撕裂=fffff80001ed0150 rsp=fffffa60087b4600 rbp=fffffa60087b4840 r8=0000000000000006 r9=fffff80001e4e000 r10=ffffffffffffff88 r11=fffff8000204c000 r12=0000000000000000 r13=0000000000000000 r14=0000000000000000 r15=0000000000000000 iopl=0 nv up ei pl zr na po nc nt!RtlVirtualUnwind+0x250: fffff800`01ed0150 488b02 mov rax,qword ptr [rdx] ds:00000000`000000d8=??????????????????? 。陷阱 重置默认范围 LAST_CONTROL_TRANSFER:从 fffff80001ea81ee 到 fffff80001ea8450 堆栈文本: fffffa60`005f1a68 fffff800`01ea81ee : 00000000`0000007f 00000000`00000008 00000000`80050033 00000000`000006f8 : nt!KeBugCheckEx fffffa60`005f1a70 fffff800`01ea6a38 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiBugCheckDispatch+0x6e fffffa60`005f1bb0 fffff800`01ee1678 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiDoubleFaultAbort+0xb8 fffffa60`087b3c90 fffff800`01ea82a9:fffffa60`087b43c8 00000000`00000001 fffffa60`087b4470 00000000`0000023b:nt!KiDispatchException+0x34 fffffa60`087b4290 fffff800`01ea70a5 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000001 : nt!KiExceptionDispatch+0xa9 fffffa60`087b4470 fffff800`01ed0150 : fffffa60`087b5498 fffffa60`087b4e70 fffff800`01f95190 fffff800`01e4e000 : nt!KiPageFault+0x1e5 fffffa60`087b4600 fffff800`01ed3f78 : fffffa60`00000001 00000000`00000000 00000000`00000000 ffffffff`ffffff88 : nt!RtlVirtualUnwind+0x250 fffffa60`087b4670 fffff800`01ee1706:fffffa60`087b5498 fffffa60`087b4e70 fffffa60`00000000 00000000`00000000:nt!RtlDispatchException+0x118 fffffa60`087b4d60 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiDispatchException+0xc2 堆栈命令:kb FOLLOWUP_IP: nt!KiDoubleFaultAbort+b8 fffff800`01ea6a38 90 无 SYMBOL_STACK_INDEX:2 SYMBOL_NAME: nt!KiDoubleFaultAbort+b8 FOLLOWUP_NAME:机器所有者 模块名称:nt IMAGE_NAME:ntkrnlmp.exe DEBUG_FLR_IMAGE_TIMESTAMP:49e0237f FAILURE_BUCKET_ID: X64_0x7f_8_nt!KiDoubleFaultAbort+b8 BUCKET_ID: X64_0x7f_8_nt!KiDoubleFaultAbort+b8 跟进:MachineOwner --------- rax=fffffa60005f1b70 rbx=fffffa60087b43c8 rcx=000000000000007f rdx=0000000000000008 rsi=fffffa60087b4470 rdi=fffff80001f9bfa4 撕裂=fffff80001ea8450 rsp=fffffa60005f1a68 rbp=fffffa60005f1c30 r8=0000000080050033 r9=00000000000006f8 r10=fffff80001ee1678 r11=fffffa60087b4468 r12=0000000000000000 r13=fffffa60087b4290 r14=fffff8000205149c r15=fffff80001e4e000 iopl=0 nv up ei ng nz na pe nc cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000282 nt!KeBugCheckEx: fffff800`01ea8450 48894c2408 mov qword ptr [rsp+8],rcx ss:0018:fffffa60`005f1a70=000000000000007f Child-SP RetAddr : Args to Child : 调用站点 fffffa60`005f1a68 fffff800`01ea81ee : 00000000`0000007f 00000000`00000008 00000000`80050033 00000000`000006f8 : nt!KeBugCheckEx fffffa60`005f1a70 fffff800`01ea6a38 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiBugCheckDispatch+0x6e fffffa60`005f1bb0 fffff800`01ee1678 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiDoubleFaultAbort+0xb8 (Trapf1) @fffffa6 fffffa60`087b3c90 fffff800`01ea82a9:fffffa60`087b43c8 00000000`00000001 fffffa60`087b4470 00000000`0000023b:nt!KiDispatchException+0x34 fffffa60`087b4290 fffff800`01ea70a5 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000001 : nt!KiExceptionDispatch+0xa9 fffffa60`087b4470 fffff800`01ed0150 : fffffa60`087b5498 fffffa60`087b4e70 fffff800`01f95190 fffff800`01e4e000 : nt!KiPageFault+0x1e5 (TrapFrame @ fffffa60`087b4470) fffffa60`087b4600 fffff800`01ed3f78 : fffffa60`00000001 00000000`00000000 00000000`00000000 ffffffff`ffffff88 : nt!RtlVirtualUnwind+0x250 fffffa60`087b4670 fffff800`01ee1706:fffffa60`087b5498 fffffa60`087b4e70 fffffa60`00000000 00000000`00000000:nt!RtlDispatchException+0x118 fffffa60`087b4d60 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiDispatchException+0xc2

【问题讨论】:

    标签: delphi debugging delphi-2009 bsod


    【解决方案1】:

    windbg 的帮助文件更详细地介绍了各种内核模式错误检查以及如何处理它们。我真的不知道您的专业水平或您在这里的期望,但一般来说,您在诸如 delphi 之类的用户模式程序中所做的任何事情都不会导致错误检查。因此,我们通常会假设存在驱动程序错误或某种硬件故障。

    我在帮助索引中输入了UNEXPECTED_KERNEL_MODE_TRAP,得到了这个页面:

    Windows 驱动程序工具包:调试工具 错误检查 0x7F: UNEXPECTED_KERNEL_MODE_TRAP UNEXPECTED_KERNEL_MODE_TRAP 错误检查 值为 0x0000007F。这个错误 检查表示 Intel CPU 产生了一个陷阱并且内核失败了 抓住这个陷阱。

    这个陷阱可能是一个绑定陷阱(一个 陷阱内核不允许 抓住)或双重错误(一个错误, 处理较早时发生 故障,这总是导致 系统故障)。

    省略...

    0x00000008,或双重故障,表示 通话过程中出现异常 处理程序以获取先前的异常。 通常,这两个例外是 串行处理。然而,有 几个不能的例外 串行处理,并在此 处理器发出信号的情况 双重错误。常见的有两种 双重故障的原因:

    一个内核 堆栈溢出。发生这种溢出 当一个保护页被击中时, 内核尝试推送一个陷阱帧。 因为没有剩余堆栈,所以 堆栈溢出结果,导致 双重错误。如果你认为这 概述已经发生,使用 !thread 来 确定堆栈限制,然后 使用 kb(显示堆栈回溯) 一个大参数(例如,kb 100) 显示完整堆栈。

    一个 硬件问题。

    原因 通常会发生错误检查 0x7F 安装故障或 不匹配的硬件(尤其是 内存)或者如果安装了硬件 失败。

    当 内核堆栈溢出。这个溢出 如果有多个驱动程序,则会发生 附加到同一个堆栈。为了 例如,如果两个文件系统过滤器 驱动程序连接到同一个堆栈 然后文件系统递归回来 in,堆栈溢出。

    省略...

    它对此进行了更详细的介绍,以及各种调试技术以及您可以采取哪些措施来解决问题。

    【讨论】:

    • 谢谢你,我也觉得用户模式应用程序不会导致 BSOD 但不太确定,这似乎太巧合了,它只发生在 Delphi 上2009 在多次重新启动后应用程序中的同一点,但内存必须在正确的位置。我认为 Vista 64 位有地址随机化。无论如何,事实证明那台机器上的内存出现故障(使用 MS“Windows 内存诊断”和 MemTest86+ 进行测试。再次感谢。
    • 上述描述不正确,MSDN 对此也有错误。这意味着内核堆栈大小不足。此外,内核堆栈由无效页面保护。因此,当您在该页面上点击无效地址时,处理器会生成页面错误,尝试推送寄存器并获得第二个页面错误。这就是“双重错误”的意思。
    猜你喜欢
    • 2010-11-03
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2011-01-13
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多