精华内容
下载资源
问答
  • windows生成dump文件,分析dump文件排查windows客户端异常
  • 为处理windows程序崩溃问题,有必要引入异常捕获模块。本资源主要讲述如何配置产生dump文件的环境以及dump文件产生后的分析定位。
  • windows C++ 产生dump文件的demo,定位代码内存错误非常有效
  • Windowsdump文件的生成

    千次阅读 2019-12-25 22:32:06
    WindowsDump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为Full Dump和Minidump。Full...


    Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为Full Dump和Minidump。Full Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Minidump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。在程序开发过程中出现的应用崩溃属于用户模式Dump。

    Dump文件是进程的内存镜像,与Linux 中的 core 文件类似;往往程序在异常(cpu占用高、死锁、崩溃等)时我们都可以借助dump文件来进行分析,也就是通过查看当时各个线程的内存、堆栈情况,还原“案发现场“。那我们一般怎么能在程序异常的时候得到我们想要的dump文件呢? 本文接下来将介绍四种比较常见的方式;

    1、手动生成

    这个一般在程序异常但没有退出的情况下我们可以采用手动生成,例如,生成Chrome进程的dump 文件;

    注: 使用任务管理器生成转储文件需要遵循一个原则:用32位任务管理器给32位进程(无论该进程是运行在32位还是64位系统上面)生成转储文件,用64位任务管理器给64位进程生成转储文件。在64位系统上,32位的任务管理器位于C:\Windows\SysWOW64\taskmgr.exe

    1)打开任务管理器

    ​      64位默认打开的任务管理器是64位的,如下所示:在这里插入图片描述
          如果需要给32位进程生成dump文件,则需要进入C:\Windows\SysWOW64 目录,手动执行taskmgr.exe 程序,如下,任务管理器后面会多出个 32 位:
    在这里插入图片描述
    2)右键选中异常进程,选择创建转储文件,如下即可:
    在这里插入图片描述
    默认路径: C:\Users\用户\AppData\Local\Temp,进入该目录我们就能看到刚才生成的chrome.DMP文件。

    注: 这里也不是说必须这样做,如果我们拿到一个64位任务管理器给32位程序转储的dump 文件怎么办呢?这个将会在下一篇《Windows下dump 文件的分析》中作介绍。

    2、修改注册表

    1) Win + R 输入regedit打开注册表

    2)找到注册表路径:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps
    

    3)在右边窗口新建->字符串值 DumpCount,DumpFolder,DumpType 并修改其值,如下:
    在这里插入图片描述
    这样系统在程序崩溃时就会在C:\CrashDump 文件夹下生成对应程序的dump文件。在实际工作中,我们可以将这些操作写成一个脚本文件,一键完成。

    对上面DumpType解释:

    0 = Create a custom dump
    1 = Mini dump
    2 = Full dump


    3、Windbg

    生成方法:File菜单–>Attach to Process–>输入命令.dump /ma /u d:\test.dmp ,这里我选择的还是chrome.exe 某个进程,如下所示。
    在这里插入图片描述
    提示成功之后,可以在D盘看到生成dmp文件到test_2924_2019-12-24_23-30-09-652_2ab8.dmp文件。
    2924_2019-12_24-23-30-09-652_2ab8是/u参数附加上去的,意思是2019年12月24日 23时30分09秒652毫秒,进程PID为2ab8。
    .dump命令参数比较多,常用的组合就是/ma,/m表示生成minidump,/a表示dmp包含所有信息,/u参数就是上面说的附加时间和PID信息到文件名。


    4、代码生成

    一般我们在写程序对能够预期的异常都会作异常捕获或保护处理;但是如果发生了未预期的异常,一般则转由Windows提供的默认异常处理器来进行处理,这个特殊的异常处理函数为UnhandledExceptionFilter(这就是为什么一般情况下我们拿到程序崩溃的文件时,我们需要通过命令去查看哪个线程有UnhandledExceptionFilter异常函数被调用)。该函数会显示一个消息框,提示发生了未处理的异常,同时,让用户选择结束或调试该进程。在了解了这个关系之后,我们就可以通过覆盖默认的异常处理操作,即通过调用函数SetUnhandledExceptionFilter 来完成覆盖,该函数原型如下:

    LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
            _In_ LPTOP_LEVEL_EXCEPTION_FILTER  lpTopLevelExceptionFilter)
    

    lpTopLevelExceptionFilter即异常处理函数指针,如果设置为NULL,则默认使用UnhandledExceptionFilter。因此我们可以对照lpTopLevelExceptionFilter自定义一个异常处理函数;然后在该异常处理函数中再通过调用函数MiniDumpWriteDump来实现程序异常时的内存转储。

    LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
    {
        SYSTEMTIME st;
        GetLocalTime(&st);
     
        CString time_now = _T("");
        time_now.Format(_T("%04d_%02d_%02d_%02d_%02d_%03d.dmp"), st.wYear, st.wMonth, st.wDay,st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
        CString dump_file_path = GetRootPath();            //获取程序所在的文件夹的路径
        dump_file_path += _T("dump/");
        CreateDirectory(dump_file_path, NULL);
        dump_file_path += time_now;
        
        HANDLE hFile = CreateFile(dump_file_path, GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
        if( hFile == INVALID_HANDLE_VALUE )
            return EXCEPTION_CONTINUE_EXECUTION; // 往下传,继续交给 windows 默认的处理函数处理
    
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId = GetCurrentThreadId();
        mdei.ExceptionPointers = ExceptionInfo;
        mdei.ClientPointers = NULL;
        MINIDUMP_CALLBACK_INFORMATION mci;  
        mci.CallbackRoutine     = NULL;  
        mci.CallbackParam       = 0;  
    
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);  
    
        CloseHandle(hFile);
    
        return EXCEPTION_EXECUTE_HANDLER;
    }
    

    一般我们在程序入口处设置异常捕获函数,如下:

    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    

    如果仅仅像上面那样写的话,仍然有可能会发现有时我们写的程序崩溃了,但是没有生成dump文件,或是程序崩溃时还是弹出window的错误报告窗口,也就是说程序崩溃时并没有调用我们重写的异常处理函数,还是调用了Windows默认的异常处理函数,这是怎么回事呢 ? 我们又该如何解决呢?

    原因: SetUnhandledExceptionFilter是无法捕获 printf, scan, strlen 等CRT函数的异常的,如printf(NULL)异常;

    解决方法: 在SetUnhandledExceptionFilter (…) 之后,利用 Hook 技术对 SetUnhandledExceptionFilter 接口进行处理“屏蔽”,这样就可以防止其他地方再去调用这个函数了;

    void DisableSetUnhandledExceptionFilter()
    {
        void* addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
     
        if (addr != NULL)
        {
            unsigned char code[16];
            int size = 0;
     
            code[size++] = 0x33;
            code[size++] = 0xC0;
            code[size++] = 0xC2;
            code[size++] = 0x04;
            code[size++] = 0x00;
     
            DWORD dwOldFlag, dwTempFlag;
            VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
            WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
            VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
        }
    }
    

    这样我们在函数入口的地方做如下调用即可:

    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    DisableSetUnhandledExceptionFilter();
    

    至于为什么SEH(异常处理结构体)函数无法捕获CRT函数的异常呢,是因为这些函数内部在有异常发生的时候,会自调用SetUnhandledExceptionFilter这个函数,我们知道这个函数是注册了一个异常调用传递链表,每次调用这个函数,都会把新的回调函数放到链表的头部,系统只会把异常传递给这个链表的表头,而第一个接收到异常的处理函数可以继续将异常传递给链表后面的异常处理函数去继续处理,也可以直接截断。

    /* 代码来源于 gs_report.c */
    /* Make sure any filter already in place is deleted. */
    SetUnhandledExceptionFilter(NULL);
    UnhandledExceptionFilter(&ExceptionPointers);
    
    展开全文
  • Windows下Qt生成dump文件并定位bug(基于qBreakpad)-附件资源
  • expdp userid='sys/username@127.0.0.1:1521/DBSID AS SYSDBA' directory=DUMPDIR dumpfile=DBSID-202001101431.dmp schemas=schema1,schema2 logfile=DBSID-202001101431.log 二、单个表空间导出 expd...

    一、多个表空间schema导出

    expdp userid='sys/username@127.0.0.1:1521/DBSID AS SYSDBA' directory=DUMPDIR dumpfile=DBSID-202001101431.dmp schemas=schema1,schema2 logfile=DBSID-202001101431.log

     

    二、单个表空间导出

    expdp username/password@127.0.0.1:1521/DBSID directory=DUMPDIR dumpfile=DBSID-202001101431.DMP logfile=DBSID-202001101431.log

     

    三、查看导出文件目录
    select * from dba_directories;

     

    四、数据表备份
    create table table_name_bak as select * from table_name;
    insert into table_name_bak select * from table_name;

    五、机构树递归
    select t.org_code,t.org_name,t.org_parent_code from bas_org t where t.is_delete is null start with t.org_code=-1 connect by prior t.org_code=t.org_parent_code

    展开全文
  • 在window程序中,添加代码一边在程序崩溃时候产生coredump,能准确定位崩溃地点。
  • dump文件是进程的内存镜像。可以把程序的执行状态,即当时程序内存空间数据通过调试器保存到dump文件中。 1、利用WinDbg里的adplus来获取dump文件 Adplus.vbs 是一个Visual Basic Script 文件,Adplus 主要用来生成...

     dump文件是进程的内存镜像。可以把程序的执行状态,即当时程序内存空间数据通过调试器保存到dump文件中。

    1、利用WinDbg里的adplus来获取dump文件

    Adplus.vbs 是一个Visual Basic Script 文件,Adplus 主要用来生成内存转储文件 (dump file),内存转储文件适用于不能实时调试的情况下。在WinDbg安装目录里可以找到adplus.vbs,使用adplus.vbs生成dump文件,

    adplus -hang -o d:\dump -p 1234

    其中hang表示附加到进程,如果是crash,则为目标进程崩溃的时候抓取,-o后面的参数表示dump文件存到位置,-p后面的数字为进程的PID,也可以是-pn后面跟进程名称,如:adplus.vbs -hang -pn ConsoleWindbg.exe -o D:\dump

    2、使用Debug Diagnostic Tool(DebugDiag)工具获取dump文件

    下载Debug Diagnostic Tool然后进行安装,打开该工具,Debug Diagnostic Tool可以选择不同的规则来进行dump文件。可以根据程序崩溃时捕获dump文件,也可以根据性能指标来进行捕获,如CPU过高,死锁,HTTP响应时间过程等参数。如下图:

    也可以找到对应的进程,通过如下方法进行捕获。此种方式获取的dump文件放到C:\Program Files\DebugDiag\Logs\Misc下。

    3、使用.dump命令

    1) 打开WinDBG—>File—>Attach to a Process,然后选择将之要进行捕获的进程。如我们这里要对ConsoleWindbg.exe进程产生dump文件。选择后如图:

    2)在上图红色区域的输入框内输入产生dump 文件的命令 .dump 。可以选择不同的参数来生成不同类型的dump文件。

    选项(1): /m

    命令行示例.dump /m D:/dump/myapp.dmp

    注解: 缺省选项,生成标准的minidump, 转储文件通常较小,便于在网络上通过邮件或其他方式传输。 这种文件的信息量较少,只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息。

    选项(2): /ma

    命令行示例.dump /ma D:/dump/myapp.dmp

    注解: 带有尽量多选项的minidump(包括完整的内存内容、句柄、未加载的模块,等等),文件很大,但如果条件允许(本机调试,局域网环境), 推荐使用这中dump。

     选项(3):/mFhutwd

    命令行示例.dump /mFhutwd D:/dump/myapp.dmp

    注解:带有数据段、非共享的读/写内存页和其他有用的信息的minidump。包含了通过minidump能够得到的最多的信息。是一种折中方案。

    4、使用ProcDump工具

    Procdump是一个轻量级的命令行工具, 它的主要目的是监控应用程序的CPU异常动向, 并在此异常时生成crash dump文件, 供研发人员和管理员确定问题发生的原因。你还可以把它作为生成dump的工具使用在其他的脚本中。有了它, 就完全不需要在同一台服务器上使用诸如32位系统上的Debug Diag 1.1或是64位系统上的ADPlus了。

    Procdump下载:http://technet.microsoft.com/en-us/sysinternals/dd996900

    procdump -ma -c 50% -s 3 -n 2 5844 (Process Name or PID) -o c:\dumpfile

    -ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息。

    -c 在CPU使用率到达这个阀值的时候, 生成dump文件。

    -s CPU阀值必须持续多少秒才抓取dump文件。

    -n 在该工具退出之前要抓取多少个dump文件。

    -o dump文件保存目录。

    展开全文
  • windows dump文件产生原理

    千次阅读 2020-04-20 15:31:26
    1、 要清楚,Dump文件Windows启动的一个保险机制,而蓝屏主要是用做给系统争取时间进行收集Dump文件所用,所以一个逻辑是必然会有的,那就是如果蓝屏必然触发Dump机制,Dump机制会根据系统设置进行Mini或Full的...

    如何确保有Dump文件?

    1、 要清楚,Dump文件是Windows启动的一个保险机制,而蓝屏主要是用做给系统争取时间进行收集Dump文件所用,所以一个逻辑是必然会有的,那就是如果蓝屏必然触发Dump机制,Dump机制会根据系统设置进行Mini或Full的收集。

    2、 关于Dump文件的大小,如果Dump设置的存放位置不满足Dump文件大小也是不会产生Dump文件:

    a) MiniDump文件大小:取决于Windows 运行时内存页大小,比如当前CVM跑的是数据库,那么产生的Dump文件大小就是数据库交换内存的概要信息,比如说16G内存有20%被使用,宕机时所产生的Dump文件就是3.2g的概要信息(即涉及到的进程的大概地址)

    b) FullDump文件大小:取决于Windows物理内存大小,FullDump即完整收集模式,将整个系统在宕机时的整个内存运行态进行记录,通常该文件的大小是物理大小的1.0 ~ 1.5倍左右(倍数的浮动取决于虚拟内存交换设置的大小)

    3、 所以,要确保有Dump文件,最低条件是:

    a) 开启Windows系统的Dump

    b) 确保设置的位置剩余空间是物理内存1.5倍以上

    c) 若要完整的Dump日志进行分析,请选择完整收集模式

    注1:QCloud Windows Server 2008R2为避免磁盘风险,默认不开启FullDump模式,所以如果需要详细Debug文件,则手动开启即可:
    如果您想要启用完全内存转储选项,手动设置为 0x1 以下注册表子项下的CrashDumpEnabled注册表项并重新启动 Windows:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl

    启动和故障恢复的注册表值

    使用下面的注册表值:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl
    CrashDumpEnabled REG_DWORD 0x0 = 无
    CrashDumpEnabled REG_DWORD 0x1 = 完全存储器转储
    CrashDumpEnabled REG_DWORD 0x2 = 核心内存转储
    CrashDumpEnabled REG_DWORD 0x3 = 小内存转储 (64 KB)

    CrashDumpEnabled REG_DWORD 0x7 =自动内存转储
     

    CrashControl 的额外的注册表值:

    0x0 = 禁用
    0x1 = 已启用

    AutoReboot REG_DWORD 0x1
    转储文件 REG_EXPAND_SZ %SystemRoot%\Memory.dmp
    LogEvent REG_DWORD 0x1
    MinidumpDir REG_EXPAND_SZ %SystemRoot%\Minidump
    覆盖 REG_DWORD 0x1
    SendAlert REG_DWORD 0x1


    注意: 您必须重新启动 Windows 以使更改生效。

    BSOD有三大规则会触发:

    • 保护规则:当低级特权的代码直接访问高级特权代码与数据时(如某些安全防护软件通过用户态进行驱动修改)就会触发BSOD;
    • 异常处理:程序异常时程序本身没有写好完整的异常处理回路,系统接收到异常则启动先行中断机制,所以程序设计存在问题时也有可能触发蓝屏(比如之前0Day漏洞黑客所用的工具导致蓝屏,明显就是没有写好异常处理回路)
    • SDK、DDK中调用了只有在特定IRQL调用的内核参数,即只有特定CPU中断请求的时候才可以使用DDK调用的内核参数在未到中断请求时被发起调用(一般出现于.Net Winform应用中)

    在腾讯云主机上,一般第一、二规则导致的BSOD Case比较多。

    附蓝屏产生过程:

    转储原理:

     

    展开全文
  • 1. 写注册表 AutoDump.bat: ...HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Wind...
  • Windows下的Dump文件

    千次阅读 2017-08-04 10:41:10
    一、 生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只使用与程序...
  • windows 应用程序崩溃时的内存转储及dump文件的分析
  • Windowsdump文件生成与分析

    万次阅读 多人点赞 2017-12-07 12:16:03
    一、 生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出...
  • BlueScreenView蓝屏dump文件查看分析工具,内核开发好助手
  • windows下qt生成及使用dump文件

    千次阅读 2019-01-12 12:02:19
    1. 生成dump文件 LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException){//程式异常捕获 /* ***转储堆栈信息*** */ //创建 Dump 文件 QString dumpFilename = QString("D:\\VerSysTombs\\"...
  • windows下c++代码保存dump文件

    千次阅读 2018-06-21 11:17:34
    在main文件,或者其他的文件中添加如下代码:#include "Windows.h" #include "DbgHelp.h" int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers) { // 定义函数指针 typedef BOOL...
  • windows自动生成dump文件

    千次阅读 2018-07-25 15:05:40
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps 添加项如下图: 其中DumpType代表的含义是: 0 = Create a custom dump 1 = Mini dump 2 = Full dump 如此一来,一旦...
  • windows程序崩溃,通过此此代码可以产生完整的dump文件,并可控制产生文件数量
  • Windows下生成dump文件方法

    千次阅读 2015-01-30 15:16:46
    文件或者在文件打开工程中选择“dump files”,加载dump文件,然后按F5运行就能直接恢复crash时的现场了,你可以定位crash的代码,可以 查看调用堆栈,可以查看线程和模块信息. 五. 注意事项 对于...
  • windows系统下postgresql导入.dump文件

    千次阅读 2020-12-16 11:27:53
    2.若想导入的文件在新的库中,可新建库 依次输入数据库的 server, Database,Port和Useranme,若均为默认的直接按回车键即可;最后输入数据库的密码(口令),进入数据库; 建库命令:create database xxx; 注意一定...
  • windows程序崩溃生成dump文件

    千次阅读 2018-04-10 16:20:57
    https://www.cnblogs.com/hushaojun/p/6388153.html
  • Windows调试 - 如何使用dump文件

    千次阅读 2018-08-09 18:21:58
    我最近在开发一个windows下的程序(win7/win8),有一些case下会crash,如果在自己开发机器上调试比较简单:运行程序,然后vs attach到进程上即可,但是在每台QA的机器上安装vs时不现实的,因此我们要用到dump文件。...
  • Debugger:"D:\Windows Kits\10\Debuggers\x64\windbg.exe"是调用产生dump的程序可以用windbg 也可以用vs自带的调试工具C:\Windows\System32\vsjitdebugger.exe ".dump -ma D:\dumpWindbg\CrashDump.dmp"这句...
  • windows下生成core dump文件

    千次阅读 2016-11-17 09:43:45
    下面是从pandion里面摘取的两个文件 MiniDumper.h [cpp] view plain copy #ifndef MINIDUMPER_H  #define MINIDUMPER_H 
  • /****************第一步添加createdump.h********************************* 添加一个头文件:create...windows.h> #include <imagehlp.h> #include <stdlib.h> #pragma com...
  • javacore文件及heapdump文件分析
  • 文章目录关于Windows程序崩溃(Crash)以及生成dump文件的探究什么是崩溃(Crash),崩溃(Crash)的现象崩溃(Crash)的原因是什么如何消除崩溃时出现的异常信息对话框如何捕获崩溃(Crash)时的异常,生成dump文件来帮助寻找...
  • 我们以收集一款收费软件引起windows系统蓝屏为例子,进行讲解。 常规报错需收集日志信息:1、计费服务端日志:服务端安装目录下手动创建wxlog和wxpluglog两个文件夹,分别获取计费日志及插件日志。若网吧之前已经...
  • 描述windows下如何获取到websphere的dump信息。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,220
精华内容 36,888
关键字:

dump文件位置windows