如何分析堆栈出错的 dmp 文件

vivado2018.2 Synthesis报错但是没有错误信息-解决办法参考 身份:学生,FPGA初学者,属于半只脚碰到门槛的那种 问题描述:最近有一个项目需要FPGA编写PID算法,其中主要是涉及到有符号寄存器组之间的加减乘运算。编写完之后进行Synthesis编译,报错,但是没有错误信息,连一些相关的warning都没有,头大,大到像地球仪那种。然后查看错误日志输出文件,也没有任何信息,只是说了一句“no stack trace available, please u... 阅读详情
标 题: 【讨论】如何分析堆栈出错的 dmp 文件
作 者: 小喂
时 间: 2007-09-05,15:41
链 接: http://bbs.pediy.com/showthread.php?t=51141

如何分析堆栈出错的 dmp 文件


分析程序出错生成的 dmp 文件是事后分析的主要工作。第一步往往都是使用 WinDbg 自带的 !analyze -v 命令先进行初步分析,得到出错地址和出错堆栈后再进行详细分析。

本文介绍一个方法,当 !analyze -v 不好使的时候应该怎么得到出错地址和出错堆栈。

    int sum(int x, int y)
    {
        __asm mov ebp, 0

        return (x + y);
    }

    int sumstub(int x, int y)
    {
        int  tmp = 0;

        printf("enter fun() .../n");

        tmp = sum(x, y);

        printf("leave fun() .../n");

        return tmp;
    }

    int main(int argc, char* argv[])
    {
        printf("enter main() .../n");

        printf("sum = %d/n", sumstub(0x1234, 0x5678));

        printf("leave main() .../n");

        return 0;
    }

示例程序比较简单,在 sum 函数里面会把 ebp 清零,下面取 x 或者 y 的值时就会出错。

用 WinDbg 打开出错得到的 dmp 文件,先用 !analyze -v 分析,结果如下:

    0:000> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Exception Analysis                                   *
    *                                                                             *
    *******************************************************************************

    *** WARNING: Unable to verify checksum for Dump01.exe
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for lpk.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for Sysfer.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for usp10.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for imm32.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for apphelp.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for version.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for advapi32.dll - 
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for shlwapi.dll - 

    FAULTING_IP: 
    +0
    00000000 ??              ???

    EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 00000000
       ExceptionCode: 80000007 (Wake debugger)
      ExceptionFlags: 00000000
    NumberParameters: 0

    BUGCHECK_STR:  80000007

    PROCESS_NAME:  Dump01.exe

    ERROR_CODE: (NTSTATUS) 0x80000007 - {

    NTGLOBALFLAG:  0

    APPLICATION_VERIFIER_FLAGS:  0

    DERIVED_WAIT_CHAIN:  

    Dl Eid Cid     WaitType
    -- --- ------- --------------------------
       0   62c.928 Unknown                

    WAIT_CHAIN_COMMAND:  ~0s;k;;

    BLOCKING_THREAD:  00000928

    DEFAULT_BUCKET_ID:  APPLICATION_HANG_HungIn_ExceptionHandler

    PRIMARY_PROBLEM_CLASS:  APPLICATION_HANG_HungIn_ExceptionHandler

    LAST_CONTROL_TRANSFER:  from 7c92e9ab to 7c92eb94

    FAULTING_THREAD:  00000928

    STACK_TEXT:  
    0012f3b8 7c92e9ab 7c86372c 00000002 0012f53c ntdll!KiFastSystemCallRet
    0012f3bc 7c86372c 00000002 0012f53c 00000001 ntdll!ZwWaitForMultipleObjects+0xc
    0012fb38 00401dda 0012fb74 0012ffb0 0012ffc0 kernel32!UnhandledExceptionFilter+0x8e4
    0012fb48 00401198 c0000005 0012fb74 0040261b Dump01!_XcptFilter+0x13e
    0012ffc0 7c816fd7 011dd65c 011dd664 7ffd6000 Dump01!mainCRTStartup+0xd1
    0012fff0 00000000 004010c7 00000000 00000000 kernel32!BaseProcessStart+0x23


    FOLLOWUP_IP: 
    Dump01!_XcptFilter+13e
    00401dda 5b              pop     ebx

    SYMBOL_STACK_INDEX:  3

    SYMBOL_NAME:  Dump01!_XcptFilter+13e

    FOLLOWUP_NAME:  MachineOwner

    MODULE_NAME: Dump01

    IMAGE_NAME:  Dump01.exe

    DEBUG_FLR_IMAGE_TIMESTAMP:  46de4ed1

    STACK_COMMAND:  ~0s ; kb

    FAILURE_BUCKET_ID:  80000007_Dump01!_XcptFilter+13e

    BUCKET_ID:  80000007_Dump01!_XcptFilter+13e

    Followup: MachineOwner
    ---------

分析得到的出错地址为 0,堆栈也在内核里面。很明显这次 !analyze -v 命令出问题了,需要手动分析才能得到想要的信息。

    0:000> ~*kv

    .  0  Id: 62c.928 Suspend: 1 Teb: 7ffdf000 Unfrozen
    ChildEBP RetAddr  Args to Child              
    0012f3b8 7c92e9ab 7c86372c 00000002 0012f53c ntdll!KiFastSystemCallRet (FPO: [0,0,0])
    0012f3bc 7c86372c 00000002 0012f53c 00000001 ntdll!ZwWaitForMultipleObjects+0xc (FPO: [5,0,0])
    0012fb38 00401dda 0012fb74 0012ffb0 0012ffc0 kernel32!UnhandledExceptionFilter+0x8e4 (FPO: [Non-Fpo])
    0012fb48 00401198 c0000005 0012fb74 0040261b Dump01!_XcptFilter+0x13e
    0012ffc0 7c816fd7 011dd65c 011dd664 7ffd6000 Dump01!mainCRTStartup+0xd1
    0012fff0 00000000 004010c7 00000000 00000000 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])

    0:000> !teb
    TEB at 7ffdf000
        ExceptionList:        0012fb28
        StackBase:            00130000
        StackLimit:           0012a000
        SubSystemTib:         00000000
        FiberData:            00001e00
        ArbitraryUserPointer: 00000000
        Self:                 7ffdf000
        EnvironmentPointer:   00000000
        ClientId:             0000062c . 00000928
        RpcHandle:            00000000
        Tls Storage:          00000000
        PEB Address:          7ffd6000
        LastErrorValue:       0
        LastStatusValue:      103
        Count Owned Locks:    0
        HardErrorMode:        0

先查看所有线程的堆栈信息,然后找出比较像出了问题的线程。本次示例只有一个线程,所以肯定是该线程出错。然后显示出错线程的 TEB 信息。

    0:000> dps 0x0012a000 0x00130000

根据堆栈的位置和大小,显示堆栈的所有内容。

根据 Windows 异常处理流程可知,所有没被调试器处理的异常最终都会转到 ntdll!KiUserExceptionDispatcher 函数查找 SEH 异常处理例程来处理异常。所以在显示的堆栈信息中查找 ntdll!KiUserExceptionDispatcher 字符串。

    0012fc50  00000000
    0012fc54  7c92eafa ntdll!KiUserExceptionDispatcher+0xe
    0012fc58  00000000
    0012fc5c  0012fc84

再根据 KiUserExceptionDispatcher 函数的原型得到本次异常发生时保存的 CONTEXT 结构信息。

    ; VOID
    ; KiUserExceptionDispatcher (
    ;    IN PEXCEPTION_RECORD ExceptionRecord,
    ;    IN PCONTEXT ContextRecord
    ;    )

第二个参数指向 CONTEXT 结构,利用 WinDbg 的 .cxr 命令显示/切换 CONTEXT 结构。

    0:000> .cxr 0x0012fc84
    eax=00005678 ebx=7ffd6000 ecx=00001234 edx=7c92eb94 esi=011dd664 edi=011dd65c
    eip=0040100b esp=0012ff50 ebp=00000000 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
    Dump01!sum+0xb:
    0040100b 8b4508          mov     eax,dword ptr [ebp+8] ss:0023:00000008=????????

    0:000> kv
      *** Stack trace for last set context - .thread/.cxr resets it
    ChildEBP RetAddr  Args to Child              
    00000000 00000000 00000000 00000000 00000000 Dump01!sum+0xb (CONV: cdecl) [E:/Works/Dump01/Dump01.cpp @ 10]

现在已经找到出错地址为 0x0040100b,下面恢复正确的出错堆栈。

    0:000> ?? sizeof(ntdll!_CONTEXT)
    unsigned int 0x2cc

    0:000> ? 0x0012fc84 + 0x2cc
    Evaluate expression: 1245008 = 0012ff50

计算可知,出错前的堆栈位置在 0x0012ff50 处。

    0:000> ub 0x0040100b L 6
    Dump01!sum [E:/Works/Dump01/Dump01.cpp @ 7]:
    00401000 55              push    ebp
    00401001 8bec            mov     ebp,esp
    00401003 53              push    ebx
    00401004 56              push    esi
    00401005 57              push    edi
    00401006 bd00000000      mov     ebp,0

    0:000> dps 0x0012ff50 L 0x10
    0012ff50  011dd65c
    0012ff54  011dd664
    0012ff58  7ffd6000
    0012ff5c  0012ff70
    0012ff60  0040103b Dump01!sumstub+0x25 [E:/Works/Dump01/Dump01.cpp @ 19]
    0012ff64  00001234
    0012ff68  00005678
    0012ff6c  00000000
    0012ff70  0012ff80
    0012ff74  00401074 Dump01!main+0x1f [E:/Works/Dump01/Dump01.cpp @ 30]
    0012ff78  00001234
    0012ff7c  00005678
    0012ff80  0012ffc0
    0012ff84  0040117b Dump01!mainCRTStartup+0xb4
    0012ff88  00000001
    0012ff8c  00520eb0

    0:000> r
    Last set context:
    eax=00005678 ebx=7ffd6000 ecx=00001234 edx=7c92eb94 esi=011dd664 edi=011dd65c
    eip=0040100b esp=0012ff50 ebp=00000000 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
    Dump01!sum+0xb:
    0040100b 8b4508          mov     eax,dword ptr [ebp+8] ss:0023:00000008=????????

反汇编出错地址前的几条指令,可以知道出错原因是 0x00401006 处的指令导致 ebp 被赋零,所以接下来取参数的指令出错。再根据堆栈信息,出错前往堆栈中压入了 ebx/esi/edi 几个寄存器的值,对比 0x0012ff50 处的堆栈,可知 0x0012ff50 正好是程序出错前的堆栈地址。同时还可以得到保存在堆栈上的 ebp 的值,从而得到正确的出错堆栈。

    0:000> kv L = 0x0012ff5c
    ChildEBP RetAddr  Args to Child              
    0012ff5c 0040103b 00001234 00005678 00000000 Dump01!sum+0xb (CONV: cdecl)
    0012ff70 00401074 00001234 00005678 0012ffc0 Dump01!sumstub+0x25 (CONV: cdecl)
    0012ff80 0040117b 00000001 00520eb0 00520e20 Dump01!main+0x1f (CONV: cdecl)
    0012ffc0 7c816fd7 011dd65c 011dd664 7ffd6000 Dump01!mainCRTStartup+0xb4
    0012fff0 00000000 004010c7 00000000 00000000 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])

从这个堆栈来看,起始地址从 kernel32!BaseProcessStart 开始,结束地址也正好在出错地址处,应该是正确的出错堆栈。

==========
小喂
2007.09.05
WinDbg分析DMP文件:零基础入门必看教程 手把手教你使用WinDbg分析DMP蓝屏文件,从环境搭建到定位故障根源,零基础也能快速掌握核心技巧,轻松应对系统崩溃问题。 阅读详情

相关推荐

新手教程:使用WinDbg分析x64蓝屏DMP文件

通过实际操作引导新手使用WinDbg工具解析蓝屏生成的DMP文件,深入定位系统崩溃原因,掌握windbg分析dmp蓝屏文件的核心技巧,快速排查驱动或内存问题。

weixin_29443363的博客 892

Stack:no stack trace available, please use hs_err_<pid>.dmp instead.

一、遇见的问题 这两天遇见了一个怪事,Vivado跑综合的时候报错,但是没有提示错误点在哪里。 软件版本:Vivado2020.2 去查看综合运行日志,提示如下: 从网上查找了相关问题,有说关闭windows杀毒软件的,有说卸载Vivado重装的,有说更换Licence的,还有说将文件搬运到一个新的工程的,都没有解决。 二、调试过程: 折腾的两个晚上,主要是查找问题点,总结如下。 首先我通过一个个禁用工程中的文...

qq_43258682的博客 1万+

Windows蓝屏故障排查:DMP文件解析核心要点

掌握Windbg分析Dmp蓝屏文件的关键步骤,快速定位系统崩溃原因。通过加载正确的符号文件和执行基础命令,可精准识别引发Windows蓝屏的驱动或模块,提升故障响应效率。

weixin_42453228的博客 783

vivado implementation 失败,提示 HACOOException,no stack trace available, please use hs_err_<pid>.dmp ins

vivado implementation 失败,提示 HACOOException,no stack trace available, please use hs_err_.dmp ins

qq_35809085的博客 6128

WinDbg分析x64蓝屏DMP文件入门必看教程

手把手教你使用WinDbg进行蓝屏dmp文件的深度调试,重点解析windbg分析dmp蓝屏文件的核心步骤与实用技巧,快速定位系统崩溃原因。

weixin_42476987的博客 704

利用WinDbg进行DMP蓝屏文件排查的详细教程

深入讲解如何使用WinDbg工具对蓝屏生成的DMP文件进行精准分析,定位系统崩溃根源。掌握windbg分析dmp蓝屏文件的关键步骤与技巧,提升故障排查效率,让系统稳定性问题无处遁形。

weixin_42510201的博客 374

WINDBG错误提示及处理

今天初次使用WINDBG,遇到了两个问题,最后解决了。此处和大家一起分享一下: 1) WARNING: Non-directory path 我在符号路径里都填加了还是遇到,这时我发现其实只要添加路径即可,记得不要加入文件名。 2)WARNING: Unable to verify checksum for 使用VC工具包中的editbin工具可以为程序文件增加校验和

lopper的专栏 8885

Pure Persuit算法基础

Pure Persuit算法本身的原理不难理解,它主要基于几何原理进行的设备控制,本身不考虑太多的运动学约束。同时机器人的路径跟踪效果应该会比较依赖于预瞄点。对于曲线部分而言,如果曲率很小而预瞄点很远的话,对于曲线的跟随性应该会很差。对于直线而言,如果设备在开始时与轨迹有横向偏差,则在运动过程中机器人会逐渐收敛到曲线,但是收敛速度取决于预瞄点距离。

YiYeZhiNian的博客 1522

关于windbg调试符号表配置路径错误的问题探讨

 打开windbg.exe 开始进行‘内核调试’(kernel debug)时,命令行窗口输出错误提示 :Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntkr

ltl51com的专栏 7490

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4089

从零到一:基于STM8的125KHz RFID读卡器实现与曼彻斯特码解析实战

本文详细介绍了基于STM8单片机的125KHz RFID读卡器实现过程,重点解析了曼彻斯特码的编码原理与解码算法。通过硬件电路设计、软件实现及性能优化,帮助开发者低成本构建稳定读取EM4100卡片的系统,适用于门禁、考勤等应用场景。

weixin_42525211的博客 238

VC程序查错之内存访问异常

作者:langouster 先来看下面这张图,相信很多程序员都见过类似。 --------------------------- test1.exe - 应用程序错误 --------------------------- "0x00401002" 指令引用的 "0

lizheng308的专栏 1492

ray.tune调参学习笔记0:调参基本流程

本篇总结python中使用tune调参的整体流程

Mr_111000的专栏 2623

小白必看:用Windbg分析蓝屏DMP文件入门指南

但有了这个工具,即使是完全不懂编程的小白,也能轻松上手分析蓝屏原因。每次电脑蓝屏时,系统都会自动生成一个DMP文件,它就像电脑的"黑匣子",记录了蓝屏时的系统状态。通过分析这个文件,我们可以找到导致蓝屏的罪魁祸首,可能是某个驱动程序、硬件问题或者系统错误。它的界面非常友好,操作简单,还有详细的指导说明,特别适合新手使用。对于不熟悉命令行操作的用户来说,这个功能特别友好,可以一目了然地看到问题发生的路径。最棒的是工具提供了练习模式,用户可以上传自己的DMP文件进行实战分析。0x00000050:页面错误。

ThunderstormLynx23的博客 489

ZLMediaKit在Windows下启用WebRtc编译(64位)

准备软件 cmake-gui vs2017 已经编译好的windows版本openssl(下载地址) 当然,你完全可以自己按照openssl的官网教程自己编译windows版本的openssl libsrtp编译安装 首先,需要将下载好的openssl解压并添加到环境变量。如下图,将下图路径添加到环境变量 其次,下载libsrtp(下载地址) 下载后解压并新建build文件夹,如下图: 在合适位置新建文件夹放置install后的srtp文件,如"D:\develop20..

byna11sina11的博客 1万+

2026年1至9月武汉市房地产价格深度分析报告

本报告基于2026年1月至9月武汉市实际成交案例,从成交价格、区域分布、户型结构、价格走势等维度进行深度分析。数据来源包括武汉市住房保障和房屋管理局备案数据、主要中介机构成交记录及典型楼盘网签案例,覆盖全市15个行政区及主要功能板块。

王国平的博客 336

Windows上Qt程序生成pdb文件,并在exe崩溃时生成dmp文件,且由dmp查询崩溃原因

Qt在windows下dump文件bug溯源

joyopirate的博客 5155

CATIA二次开发一一一装配体与零件之间的坐标转换

输入参数:Product(产品实例对象)、iPointToTransfor(待转换坐标点CATMathPoint)核心逻辑:通过产品对象的绝对位置变换矩阵,计算逆向变换实现坐标系转换。输出参数:Point(转换后的局部坐标点CATMathPoint)

工业软件开发 1135

WINDBG分析DMP方法

上次发了2100蓝屏抓DMP分析案例这个帖子后,好多人想学怎么分析DMP,那我也是刚刚学的,简单的说下。http://bbs.icafe8.com/forum.php?mod=viewthread&tid=399075&fromuid=301231:先下载附件WinDbg,解压出来后,直接运行里面的windbg.exe。(或者可以自已去网上下的)WinDbg.part11.ra...

weixin_30485799的博客 560

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5525

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: WinDbg配置和使用基础
下一篇: drwtsn32.exe和adplus.vbs进行dump文件抓取
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值