Windbg生成dump
文件的方法:
程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件。 步骤:1) 打开WinDBG并将之Attach 到crash的程序进程2) 输入产生dump 文件的
命令WinDBG产生dump 文件的命令是 .dump ,可以选择不同的参数来生成不同类型的dump文件。选项(1): /m命令行示例:.dump /m C:\dumps\myapp.dmp注解: 缺省选项,生成标准的minidump, 转储文件通常较小,便于在网络上通过邮件或其他方式传输。 这种文件的信息量较少,只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息。选项(2): /ma命令行示例:.dump /ma C:\dumps\myapp.dmp注解: 带有尽量多肆粗选项的minidump(包括完虚悔整的内存内容、句柄、未加载的模块,等等),文件很大,但如果条件允许(本机调试,局域网环境), 推荐使用这中dump。选项(3):/mFhutwd命令行示例:.dump /mFhutwd C:\dumps\myapp.dmp注解:带有数据段、非共享的读/写内存页和其他有用的信息的minidump。包含了通过minidump能够得到的最多的信息。是一种折中方案那怎么裂誉镇自动生成dump文件呢,比如对方的电脑没有windbg,这里用到一个window系统自带工具,Dr.Watson运行方式很简单:直接run-输入drwtsn32 -i就可以了,会提示这样的:这个命令真难记,实话,记华生医生吧,福尔摩斯中的如果有程序崩溃,会自动生成dump,这时再输入drwtsn32就会运行这个程序:找到对应路径的DMP文件就行了,一般放在如下路径:C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson以下实例来自AWD代码:Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional. All rights reserved. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. --*/ #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <conio.h> VOID SimulateMemoryCorruption ( ) class CAppInfo { public: CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion) { m_wszAppName=wszAppName m_wszVersion=wszVersion } VOID PrintAppInfo() { wprintf(L"\nFull application Name: %s\n", m_wszAppName) wprintf(L"Version: %s\n", m_wszVersion) } private: LPWSTR m_wszAppName LPWSTR m_wszVersion } CAppInfo* g_AppInfo int __cdecl wmain (int argc, WCHAR* args[]) { wint_t iChar = 0 g_AppInfo = new CAppInfo(L"Memory Corruption Sample", L"1.0" ) if(!g_AppInfo) { return 1 } wprintf(L"Press: \n") wprintf(L"1To display application information\n") wprintf(L"2To simulated memory corruption\n") wprintf(L"3To exit\n\n\n>") while((iChar=_getwche())!='3') { switch(iChar) { case '1': g_AppInfo->PrintAppInfo() break case '2': SimulateMemoryCorruption() wprintf(L"\nMemory Corruption completed\n") break default: wprintf(L"\nInvalid option\n") } wprintf(L"\n\n>") } return 0 } VOID SimulateMemoryCorruption ( ) { char* pszWrite="Corrupt" BYTE* p=(BYTE*) g_AppInfo CopyMemory(p, pszWrite, strlen(pszWrite)) }在现场设置程序崩溃自动转储。
在windows 注册表如下项:
//HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/AeDebug
中提供了调试器的相关设置。
Debugger 设置具体的桥谈正调试器和启动参数
Auto 是否设置在发送错误前启动调试器
以windbg为例
Debugger = "Path/WinDbg.exe" -p %ld –c ".dump /ma /u C:/CrashDump.dmp" -e %ld –g
在程序崩溃敏悔的时候,将启动windbg,并将内存转储到c:/crashdump.dmp文件中。
开发人员拿到dmp文件后,就可以侍竖定位问题了。
首先, 可以选择从命令行中启动WinDBG. 举例, 使用下面的带有-logo参数的命令:windbg.exe -logo c:\logfile.txt其次, 如果你已经在一个debug session里了, 你可以使用.logopen命令来开始记录.第一步, 开启日志记录:.logopen d:\output.txt第二步, 运行你想要输出到文本文件中神野铅的命令:!address第三步, 关闭日志记录:.logclose第四步, 检查是否还有日志记录打开:比方说你抓了个full dump, 在debug一个很复杂的问题, 可能你已经有了结果, 或者还在研究当中, 这时你被别的事情打搅了, 回家了, 第二天来重开dump文件, 不记得昨天做到哪里了. 在或者说, 你的同事很牛, 他分析了dump文件并得出了结论. 你想学一下他的思路.在这两游好种情况下, 让windbg把曾经输入过的命令按顺序脊销写到文件里的功能就相当有帮助了.命令举例如下:
评论列表(0条)