当前位置:科技动态 > 恢复vs2010中的默认界面_VS2010删除原来继承的值,我试过了,没有问题

恢复vs2010中的默认界面_VS2010删除原来继承的值,我试过了,没有问题

  • 发布:2023-09-30 04:36

如何:调试Release Build

您可以调试应用程序的发布版本。

调试发布版本

打开项目的“属性页”对话框。有关详细信息,请参阅?使用项目属性。单击“C/C++”节点。将“调试信息格式”设置为“C7 兼容(/Z7)”或“程序数据库(/Zi)”。展开“链接器”并单击“常规”节点。将“启用增量链接”设置为“否”(注:NO)。选择“调试”节点。将“生成调试信息”设置为“是”(/DEBUG)。选择“优化”节点。将“引用”设置为“/OPT:REF”并将“启用 COMDAT 折叠”设置为“/OPT:ICF”。您现在可以调试您的发布构建应用程序。要查找问题,请逐步执行代码(或使用即时调试),直到找到发生故障的位置,然后确定不正确的参数或代码。如果应用程序在调试版本中工作,但在发布版本中失败,则编译器优化之一可能会暴露源代码中的缺陷。要隔离问题,请禁用每个源代码文件的选定优化,直到找到该文件和优化这就是导致问题的原因。 (为了加快这个过程,您可以将文件分成两组,对一组禁用优化,当您发现一组中存在问题时,继续划分,直到隔离出问题文件。)您可以使用 ?/RTC? 来尝试在调试版本中暴露此类错误。有关更多信息,请参阅?优化您的代码。

================

如何在Release模式下设置调试:

1。右键单击项目 -> 属性

2.c++ -> 常规 -> 调试信息格式???选择?程序数据库(/Zi)或(/ZI),注:如果是库则只能是(Zi)

3.c++ -> 优化 -> 优化????????????选择?禁用 (/Od)

4。连接器 -> 调试 -> 生成调试信息 选择?是的(/DEBUG)https://www.sychzs.cn/haizimin/article/details/50262901

有些情况下,我们可能无法直接使用Debug模式来调试程序,那么如何在Release模式下调试程序呢?

1。将项目属性设置为“发布并生成”--->“配置管理器”:

2。按Alt+F7弹出属性页进行设置:

转载于:https://www.sychzs.cn/kungfupanda/p/8960672.html

删除:VS2010项目-属性-配置属性-链接器-继承值

?方法:找到C盘的MSBuild文件夹-v4.0文件夹-Microsoft.Cpp.Win32.user.props文件,用记事本打开request,删除不需要的链接库。 。 。就是这么简单。

dump文件对于VC中的调试非常非常有用,因为我们不会在每一行代码中都添加日志。当然,如果你愿意,你也可以在每一行添加日志;

在 Windows 上,有两种方法添加转储文件:

方法一:一是在程序中添加代码;

方法二:修改注册表(参考下面bat文件写入方法,在win7上用管理员程序运行);推荐使用此方法,方便实用; (http://www.sychzs.cn/hgy413/article/details/7586957#)

来自:

http://www.sychzs.cn/byxdaz/article/details/25872151

http://www.sychzs.cn/starlee/article/details/6630816

在Windows平台下用C++开发应用程序时,你最不想看到的可能就是程序崩溃。要解决导致问题的Bug,最困难的可能就是调试release版本。由于release版本缺乏大量调试信息,更何况一般都是发布给用户使用,所以很难保留和重现崩溃场景。目前有一些方法可以解决:崩溃地址? + 地图文件;地图文件; SetUnhandledExceptionFilter + 小型转储。本文重点解决Minidump方法。

1。小型转储文件生成

??1.小型转储概念

??? minidump(小型内存转储)可以理解为转储文件,它记录了可以帮助调试崩溃的最少有用信息。事实上,如果你在系统属性?->高级->启动和恢复->设置->写入调试信息中选择“小内存转储(64 KB)”,当系统意外停止时,会出现一个带有.dmp的文件后缀将在 C:\Windows\Minidump\ 路径中生成。该文件是小型转储文件,但这是内核模式小型转储。

???我们想要生成的是用户模式小型转储。该文件包含程序运行的模块信息、线程信息、堆栈调用信息等。并且为了符合其迷你特性,转储文件被压缩。

2。生成小型转储文件

Dump文件是通过drwtsn32、NTSD、CDB等调试工具生成的?虽然drwtsn32的缺点可以通过NTSD和CDB完全解决,但并不是所有操作系统中都安装了NTSD和CDB等调试工具。根据MiniDumpWriteDump接口,程序可以自动生成Dump文件。

3。 ??自动生成Minidump文件

当程序遇到未处理的异常(主要是非指针引起的),导致程序崩溃死掉时,如果在异常发生之前调用SetUnhandledExceptionFilter()函数,该异常将会被该函数处理。 MSDN 中将其描述为:

发出 SetUnhandledExceptionFilter 会替换调用进程中所有现有和所有未来线程的现有顶级异常过滤器。

?因此,通过在程序开头添加SetUnhandledExceptionFilter()函数,并在函数中使用适当的方法生成Dump文件,就可以实现所需的功能。

生成转储文件类(minidump.h)

[cpp]?

查看平原

复制

#pragma?once?? ?? ??? ?? #包括??? ?? #包括??? ?? #包括??? ?? #pragma?comment(lib,?"dbghelp.lib")?? ?? ??? ??内联?BOOL?IsDataSectionNeeded(const?WCHAR*?pModuleName)? ?? {?? ?? ????if(pModuleName==?0)?? ?? ????{?? ?? ??????返回?FALSE;?? ?? ????}?? ?? ??? ?? ????WCHAR?szFileName[_MAX_FNAME]?=?L"";?? ?? ???_wsplitpath(pModuleName,?NULL,?NULL,?szFileName,?NULL);?? ?? ??????if(wcsicmp(szFileName,?L"ntdll")??==?0)?? ?? ??????返回?真;?? ?? ??? ?? ???返回?FALSE;??? ?? }?? ?? ??? ?? inline?BOOL?CALLBACK?MiniDumpCallback(PVOID????????????????????????pParam,???????????? ????????????????????????const?PMINIDUMP_CALLBACK_INPUT???pInput,??? ?? ????????? ????????????????????????PMINIDUMP_CALLBACK_OUTPUT?????????pOutput)?? ?? {?? ?? ????if(pInput?==?0?||?pOutput?==?0)?? ?? ??????返回?FALSE;?? ?? ??? ?? ????开关(pInput->CallbackType)?? ?? ????{?? ?? ????案例?模块回调:??? ?? ??????if(pOutput->ModuleWriteFlags?&?ModuleWriteDataSeg)??? ?? ??? ?? ????????????if(!IsDataSectionNeeded(pInput->Module.FullPath))??? ?? ??? ?? ????????????pOutput->ModuleWriteFlags?&=?(~ModuleWriteDataSeg);??? ?? ??? ?? ????案例?IncludeModuleCallback:?? ?? ????案例?IncludeThreadCallback:?? ?? ????案例?线程回调:?? ?? ????案例?ThreadExCallback:?? ?? ??????返回?真;?? ?? ??? ?? ????默认:;?? ?? ????}?? ?? ??? ?? ????返回?FALSE;?? ?? }?? ?? ??? ?? //创建转储文件?? ??内联?void?CreateMiniDump(EXCEPTION_POINTERS *?pep,?LPCTSTR?strFileName)?? ?? {?? ?? ????HANDLE?hFile?=?CreateFile(strFileName,?GENERIC_WRITE,?0,?NULL,?CREATE_ALWAYS,?FILE_ATTRIBUTE_NORMAL,?NULL);?? ?? ????if((hFile?!=?NULL)?&&?(hFile?!=?INVALID_HANDLE_VALUE))?? ?? ????{?? ?? ??????MINIDUMP_EXCEPTION_INFORMATION?mdei;?? ?? ??????mdei.ThreadId?????????=?GetCurrentThreadId();?? ?? ??????mdei.ExceptionPointers???=?pep;?? ?? ??????mdei.ClientPointers??????=?FALSE;?? ?? ??????MINIDUMP_CALLBACK_INFORMATION?m词;?? ?? ??????mci.CallbackRoutine?????=?(MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;?? ?? ??????mci.CallbackParam??????=?0;?? ?? ??????MINIDUMP_TYPE?mdt??????=?(MINIDUMP_TYPE)0x0000ffff;?? ?? MiniDumpWriteDump(GetCurrentProcess(),?GetCurrentProcessId(),?hFile,?MiniDumpNormal,?&mdei,?NULL,?&mci);?? ?? ??? ?? ??????CloseHandle(hFile);??? ?? ????}?? ?? }?? ?? ??? ?? LPTOP_LEVEL_EXCEPTION_FILTER?WINAPI?MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER?lpTopLevelExceptionFilter)?? ?? {?? ?? ???返回?NULL;?? ?? }?? ?? ??? ?? BOOL?PreventSetUnhandledExceptionFilter()?? ?? {?? ?? ????HMODULE?hKernel32?=?LoadLibrary(_T("kernel32.dll"));?? ?? ????如果?(hKernel32?==???NULL)?? ?? ??????返回?FALSE;?? ?? ??? ?? ??? ?? ????void?*pOrgEntry?=?GetProcAddress(hKernel32,?"SetUnhandledExceptionFilter");?? ?? ??????if(pOrgEntry???==?NULL)?? ?? ??????返回?FALSE;?? ?? ??? ?? ??? ?? ????无符号?char?newJump[?100?];?? ?? ????DWORD?dwOrgEntry地址?=?(DWORD)?pOrgEntry;?? ?? ????dwOrgEntryAddr?+=?5;?//?add?5?for?5?操作码?for?jmp?far?? ?? ??? ?? ??? ?? ????void?*pNewFunc?=?&MyDummySetUnhandledExceptionFilter;?? ?? ????DWORD?dwNewEntryAddr?=?(DWORD)?pNewFunc;?? ?? ????DWORD?dwRelativeAddr?=?dwNewEntryAddr?-??dwOrgEntryAddr;?? ?? ??? ?? ??? ?? ????newJump[?0?]?=?0xE9;??//?JMP?绝对?? ?? ????memcpy(&newJump[?1?],?&dwRelativeAddr,?sizeof(pNewFunc));?? ?? ????SIZE_T?bytesWritten;?? ?? ????BOOL?bRet?=?WriteProcessMemory(GetCurrentProcess(),????pOrgEntry,?newJump,?sizeof(pNewFunc)?+?1,?&bytesWritten);?? ?? ???返回?bRet;?? ?? }?? ?? ??? ?? ??? ?? LONG?WINAPI?UnhandledExceptionFilterEx(struct?_EXCEPTION_POINTERS?*pException)?? ?? {?? ?? ????TCHAR?szMbsFile[MAX_PATH]?=?{?0?};?? ?? ????::GetModuleFileName(NULL,?szMbsFile,?MAX_PATH);?? ?? ????TCHAR*?pFind?=?_tcsrchr(szMbsFile,?'\\');?? ?? ???如果(pFind)??? ?? ????{?? ?? ??????*(pFind+1)?=?0;?? ?? ??????_tcscat(szMbsFile,?_T("CreateMiniDump.dmp"));?? ?? ??????CreateMiniDump(pException,szMbsFile);?? ?? ????}?? ??? ??? ?? ??? ?? ??? / /?TODO:?MiniDumpWriteDump?? ?? ????FatalAppExit(-1,??_T("致命?错误"));?? ?? ????返回?EXCEPTION_CONTINUE_SEARCH;?? ?? }? ? ? ??? ??? ?? //运行异常处理?? ?? void?RunCrashHandler()?? ?? {?? ?? ????SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);?? ?? ????PreventSetUnhandledExceptionFilter ( );?? ?? }??

?

//测试实现文件

//?有函数调用的类

//

类?碰撞测试

{

公众:

???void?测试()

???{

??????崩溃();

???}

私人:

???void?崩溃()

???{

?????????strcpy(NULL,"adfadfg");

???}

};

int?_tmain(int?argc,?_TCHAR*?argv[])

{

???//设置异常处理函数

???RunCrashHandler();

???碰撞测试?测试;

???test.Test();

???getchar();

???返回?0;

}

注释

1。需要配置调试选项,进入C/C++选项→常规→调试信息格式(设置为程序数据库(/Zi));转到连接器选项—>调试→生成调试信息(设置为是); C /C++ 选项à优化à禁用。 (见下图)

2。可执行文件(exe)必须找到dbghelp.dll才能生成Dump文件。该 DLL 可以在调试工具包中找到。

3。 *.exe、*.pdb、*.dump、dbghelp.dll?这四个文件需要放在同一目录下,以便调试。当您双击转储文件时,它可以自动关联到错误代码的位置。

4。为了获得更多、更深入的调试信息,需要将程序优化开关设置为禁用。

5。当成功定位异常代码后,如果无法阻止异常,可以使用__try?包装异常代码的结构。 __尝试?和 ? 尝试不同?因为前者可以捕获非法指针产生的异常。

__尝试{

//?异常函数

}

__除了( EXCEPTION_EXECUTE_HANDLER ){

//?异常处理

}

2。调试小型转储文件

双击小型转储文件 (*.dmp)。默认启动vs2008。菜单工具/选项,调试/符号,添加PDB文件路径。注意:如果minidump文件和pdb文件在同一目录下,则无需设置此项。如果调试的程序需要微软基础库的PDB信息,可以添加路径为:http://www.sychzs.cn/download/symbols。在界面底部的 Cache Symbol From symbol... 下选择本地存储这些符号的路径。说明:如果本地已经存储了微软基础库的pdb,则只需按照此步骤设置本地路径即可,无需执行上一步。设置代码路径:

设置代码路径:

刚刚打开的dmp项目,输入解决方案的属性。此处输入源程序的代码路径。注意:必须是sln所在的路径,而不是vcproj的路径!

按F5并调试。

演示代码下载:http://www.sychzs.cn/detail/byxdaz/7349325

//-

#pragma once #include #include #include #pragma comment(lib, "dbghelp.lib") inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName) { if(pModuleName == 0) { return FALSE; } WCHAR szFileName[_MAX_FNAME] = L""; _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); if(wcsicmp(szFileName, L"ntdll") == 0) return TRUE; return FALSE;? } inline BOOL CALLBACK MiniDumpCallback(PVOID ? ? ? ? ? ? ? ? ? ? ? ? ? ?pParam,? const PMINIDUMP_CALLBACK_INPUT ? pInput,? PMINIDUMP_CALLBACK_OUTPUT ? ? ? ?pOutput) { if(pInput == 0 || pOutput == 0) return FALSE; switch(pInput->CallbackType) { case ModuleCallback:? if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)? if(!IsDataSectionNeeded(pInput->Module.FullPath))? pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);? case IncludeModuleCallback: case IncludeThreadCallback: case ThreadCallback: case ThreadExCallback: return TRUE; default:; } return FALSE; } //创建Dump文件 inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName) { HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) { MINIDUMP_EXCEPTION_INFORMATION mdei; mdei.ThreadId ? ? ? ? ? = GetCurrentThreadId(); mdei.ExceptionPointers ?= pep; mdei.ClientPointers ? ? = FALSE; MINIDUMP_CALLBACK_INFORMATION mci; mci.CallbackRoutine ? ? = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback; mci.CallbackParam ? ? ? = 0; MINIDUMP_TYPE mdt ? ? ? = (MINIDUMP_TYPE)0x0000ffff; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci); CloseHandle(hFile);? } } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { return NULL; } BOOL PreventSetUnhandledExceptionFilter() { HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); if (hKernel32 == ? NULL) return FALSE; void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); if(pOrgEntry == NULL) return FALSE; unsigned char newJump[ 100 ]; DWORD dwOrgEntryAddr = (DWORD) pOrgEntry; dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far void *pNewFunc = &MyDummySetUnhandledExceptionFilter; DWORD dwNewEntryAddr = (DWORD) pNewFunc; DWORD dwRelativeAddr = dwNewEntryAddr - ?dwOrgEntryAddr; newJump[ 0 ] = 0xE9; ?// JMP absolute memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc)); SIZE_T bytesWritten; BOOL bRet = WriteProcessMemory(GetCurrentProcess(), ? ?pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); return bRet; } LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException) { TCHAR szMbsFile[MAX_PATH] = { 0 }; ::GetModuleFileName(NULL, szMbsFile, MAX_PATH); TCHAR* pFind = _tcsrchr(szMbsFile, '\\'); if(pFind) { *(pFind+1) = 0; _tcscat(szMbsFile, _T("CreateMiniDump.dmp")); CreateMiniDump(pException,szMbsFile); } // TODO: MiniDumpWriteDump FatalAppExit(-1, ?_T("Fatal Error")); return EXCEPTION_CONTINUE_SEARCH; } //运行异常处理 void RunCrashHandler() { SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); PreventSetUnhandledExceptionFilter(); }

调试方法不用上述那么麻烦,直接在Debug目录下 或者 Release目录下 exe + pdb + dmp 在同一目录,然后双击dmp文件VC2010就可以打开,然后点击右上角的调试按钮就可以直接定位到崩溃的代码了;

参考这里:?http://www.sychzs.cn/starlee/article/details/6630816

别人机器上的dump调试:

http://www.sychzs.cn/xhk456/article/details/7523150

这段时间突然发现,要一下做一个金刚不坏之身的程序是不太可能滴,至于对我来说吧。 这个程序也要经过千锤百炼才能够练就一个强大的自信心。

我现在做系统就不考虑一下把程序做的足够强壮了,因为我也做不到,现在做系统时,总考虑的一个问题:

当系统异常的时候怎么去处理?

我不怕系统程序出现异常,甚至直接Over,只要能在异常时处理异常后继续运作,在崩溃重启后能够继续把没

干的活给干了,那么这个在我能够承受的范围内,也在大多数客户的承受范围内,因为这样就是我们所说的将

损失减小到最低,其实是不是最低只有自己能够知道。

当然了,我更希望能够做出一个健壮无比的牛逼程序,所以我想知道程序是在什么情况下崩溃的,可是有些问题

你懂的,老在客户机器上或者生产环境下出现,却在自己的机器上和测试环境就他妈的不出现,遇见这种情况我是

跳楼或者杀人的心情都有了,偶尔我也犯过情绪,想提出辞职申请,换个行业去,告别这苦逼的程序员生涯,

可总不知道是什么力量支持着我,让我坚强依旧滴做着程序员,过着狗日的日子。

后来,不经意间,一位同事给我说了一个种在系统中异常或者崩溃的时候,来生成dump文件,然后用调试器来调试。

这样就可以在生产环境中的dmp文件,拷贝到自己的开发机器上,调试就可以找到错误的位置,配合程序调试符号pdb文件,

直接可以定位到源代码中位置,真是太他妈的神奇了,虽然Release版本下的很多变量的值是不对滴,但并不影响我这个

这么有执着心的coder来找bug。

同事给了我他写的示例,往空指针拷贝数据,在非调试下运行后,果然的崩了,果断滴生成了一个扩展名为dmp的文件,

然后他用vs2010打开那个dmp文件,vs2010很果断滴定位到了那个往空指针拷贝数据那里。

看他那娴熟的操作,顿时感觉到了他的强大和微软的牛逼。

后来我就学他,在程序中加入程序异常时产生dump文件的功能,待系统发布后,在一次不经意间一个程序挂掉了。

在客户的谩骂中,我面带笑容说:这个问题很好解决。我满怀信心滴从服务器上拷贝了程序崩溃产生dump文件,

然后学着那个同事用vs2010打开,我了个去,咋没有定位到源代码中内,只定位到了可执行文件的一个地址,这让哥

情何以堪呐!

还好,我对pdb了解还比较熟悉,想来应该是符号文件的问题,于是就开始摸索的,不经意见的在

堆栈处右击了下,发现菜单里竟然有“加载符号”,而且还有“符号路径”,我想这大概就是让我来选择

对应的pdb文件吧,顿时感觉曙光就在前面。

点击了“符号路径”后如下图:

才发现了,它并不是来选择符号文件,而是选择对应的可执行程序的路径,选择了后果断滴定位到了源代码的位置,

才发现一个很简单很美丽的bug,修改后,在测试后重现发布,系统的健壮性又提高了一个台阶。

回头想了想,我同事给我演示的时候,他程序运行的目录和就是他直接用vs2010生成的目录,所以此种情况下

用vs2010打开dmp文件即可定位到源代码文件。而发布后的程序,一般情况下你根本不知道别人放在什么地方去执行的,

因此调试时还并必须选相同版本的可执行文件,然后pdb文件才会好好工作,要不没可执行文件,咋个调试嘛。

哎,这同事,居然还留了一手,坑爹啊。

不过还是要感谢他滴,我又掌握了一些东西,又增强了我这个苦逼程序员写好程序的信心。

在写这个之前看了相关文章,感觉比较好的推荐一哈:

http://www.sychzs.cn/woaidongmao/archive/2011/05/10/146086.html

?

到这里,你就可以在你的工程中通过代码的方式添加,在程序崩溃的时候回创建dump文件了;

.dump

.dump?命令创建一个用户模式或内核模式崩溃转储文件。分析工具:https://www.sychzs.cn/en-us/library/windows/desktop/ee416349(v=vs.85).aspx#writing_a_minidump

程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件。 步骤:

1) 打开WinDBG并将之Attach 到crash的程序进程

2) 输入产生dump 文件的命令

直接用.dump -?可以看到它的简单说明:

[cpp]?

view plain

copy

0:000>?.dump?-??? Usage:?.dump?[options]?filename?? Options?are:?? ??/a?-?Create?dumps?for?all?processes?(requires?-u)?? ??/b[a]?-?Package?dump?in?a?CAB?and?delete?dump?? ??/c??-?Add?a?comment?(not?supported?in?all?formats)?? ??/j??-?Provide?a?JIT_DEBUG_INFO?address?? ??/f?-?Create?a?legacy?style?full?dump?? ??/m[acdfFhiprRtuw]?-?Create?a?minidump?(default)?? ??/o?-?Overwrite?any?existing?file?? ??/u?-?Append?unique?identifier?to?dump?name??

?

/o?:覆盖具有相同名字的dump文件。如果没有使用该选项又存在一个相同名字的文件,则dump文件不会被写入:比如我的C盘原有一个myapp.dmp文件:

[cpp]?

view plain

copy

0:000>?.dump?c:/myapp.dmp?? Unable?to?create?file?'c:/myapp.dmp'?-?Win32?error?0n80?? ????"文件存在。"?? 0:000>?.dump?/o?c:/myapp.dmp?? Creating?c:/myapp.dmp?-?mini?user?dump?? Dump?successfully?written??

/f?

(用户模式:)?创建一个

完整用户模式dump,这里要注意不要字面理解,

完整用户模式dump是基本的用户模式dump文件。这种dump文件包含进程的完整内存空间、程序本身的可执行映像、句柄表和其他对调试器有用的信息

注意?和名字无关,最大的"minidump"文件实际上可以提供比完整用户模式dump更多的信息。例如,.dump /mf或.dump /ma将创建比.dump /f更大更完整的文件。

用户模式下,使用.dump /m[MiniOptions] 是最好的选择。通过这个开关创建的dump文件可以很小也可以很大。通过指定合适的MiniOptions?可以控制究竟需要包含哪些信息。

?

[cpp]?

view plain

copy

0:000>?.dump?/o/f?c:/myapp.dmp?? *****************************************************************************?? *?.dump?/ma?is?the?recommend?method?of?creating?a?complete?memory?dump??????*?? *?of?a?user?mode?process.???????????????????????????????????????????????????*?? *****************************************************************************?? Creating?c:/myapp.dmp?-?user?full?dump?? Dump?successfully?written??

我们看到了,系统给出了提示:.dump /ma是创建完整dump的推荐方式(用户模式下)

/m[

MiniOptions] 创建一个

小内存dump(内核模式)或者?

minidump?(用户模式)。如果没有指定

?/f?和

/m?,

/m?是默认选项。

用户模式下,

/m?后面可以跟附加的

MiniOptions?用来指定dump文件中包含的数据。如果没有使用

MiniOptions?,dump文件包含模块、线程和调用堆栈信息,但是没有其他附加信息

MiniOption作用a创建一个包含所有附加选项的minidump。/ma选项相当于/mfFhut?—它会在minidump中添加完整的内存数据、句柄数据、已卸载模块信息、基本内存信息和线程时间信息。f在minidump中包含完整内存数据。目标程序拥有的所有 可访问的已交付的页面(committed pages)都会包含进去。F在minidump中添加所有基本内存信息。这会将一个流加入到包含完整基本内存信息的minidump中,而不单是可使用的内存。这样可以使得调试器能够重建minidump生成时进程的完整虚拟内存布局。h在minidump中包含和目标进程相关的句柄信息。u在minidump中包含已卸载模块信息。仅在Windows Server 2003和之后版本的Windows中可用。t在minidump中包含附加的线程信息。包括可以在调试minidump时使用!runaway扩展命令或.ttime?(Display Thread Times)命令进行显示的线程时间。i在minidump中包含次级内存(secondary memory)。次级内存是由堆栈中的指针或备份存储(backing store)中引用到的任何内存,加上该地址周围的一小段区域。p在minidump中包含进程环境块(PEB)和线程环境块(TEB)。这在想访问程序的进程和线程相关的Windows系统信息时很有用。w将所有已交付的可读写的私有页面包含进minidump。d在minidump中包含可执行映像中所有可读写的数据段。c加入映像中的代码段。r从minidump中去掉对重建调用堆栈无用的堆栈和存储内存部分。局部变量和其他数据类型值也被删除。这个选项不会使得minidump变小(因为这些内存节仅仅是变成0),但是当想保护其他程序中的机密信息时有用。R在minidump中去掉完整的模块路径。仅包含模块名。如果想保护用户的目录结构时该选项有用。

选项(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能够得到的最多的信息。是一种折中方案。

Fhutwd按字母对应上面的MiniOptions表示

?

//-xp自动生成dump-----------------------------------------------------------------------------------------------------------------------------------------------------------------

那怎么自动生成dump文件呢,比如对方的电脑没有windbg,这里用到一个window XP系统自带工具,Dr.Watson

运行方式很简单:

直接run-输入drwtsn32 -i就可以了,会提示这样的:

这个命令真难记,实话,记华生医生吧,福尔摩斯中的

如果有程序崩溃,会自动生成dump,这时再输入drwtsn32就会运行这个程序:

找到对应路径的DMP文件就行了,一般放在如下路径: C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson

?

?//-win7自动生成dump-----------------------------------------------------------------------------------------------------------------------------------------------------------------

win7下需打开regedit--> 找到:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]

在它下面加一项LocalDumps,并做如下项配置:

Value描述Type默认值DumpFolder文件保存路径REG_EXPAND_SZ%LOCALAPPDATA%CrashDumpsDumpCountdump文件的最大数目REG_DWORD10DumpType指定生成的dump类型: 0:Custom dump 1:Mini dump 2:Full dumpREG_DWORD1CustomDumpFlags仅在DumpType为0时使用 为MINIDUMP_TYPE的组合REG_DWORDMiniDumpWithDataSegs|MiniDumpWithUnloadedModules|MiniDumpWithProcessThreadData

?

可以写成.bat:

[cpp]?view plaincopy

@echo?off?? echo?设置Dump...?? reg?add?"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps"?? reg?add?"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps"?/v?DumpFolder?/t?REG_EXPAND_SZ?/d?"C:\MyDump"?/f?? reg?add?"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps"?/v?DumpType?/t?REG_DWORD?/d?2?/f?? reg?add?"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps"?/v?DumpCount?/t?REG_DWORD?/d?10?/f?? echo?Dump已经设置?? pause?? @echo?on??

[cpp]?view plaincopy

@echo?off?? echo?正在取消设置Dump...?? reg?delete?"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps"?/f?? echo?Dump已经取消设置?? pause?? @echo?on??

LocalDumps是全局的,如果想针对指定进程单独设置,如test1.exe,则在/LocalDumps下新建子项test1.exe,同时在test1目录下复制上表的选项,这样,系统就会先读全局设置,再读子项test1.exe的设置

简单测试:

void CtMFC5Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 char * pstr = NULL;

int n = strlen( pstr );

}

在Windows 7上可以由多个方法产生dump文件:

转一篇文章:

Windows调试 - 如何使用dump文件

如何使用dump文件

我最近在开发一个windows下的程序(win7/win8),有一些case下会crash,如果在自己开发机器上调试比较简单:运行程序,然后vs attach到进程上即可,但是在每台QA的机器上安装vs时不现实的,因此我们要用到dump文件。

微软网站有一篇文章讲述如何创建dump文件:

http://www.sychzs.cn/kb/931673

第一种: 通过任务管理器:这种适用在程序挂了(crash)的时候进程还未退出,比如我运行程序,出现了下面的错:

此时打开任务管理器,右击相应进程,点击"Create Dump File“:

一会创建完成:

然后把这个DMP文件拷到开发机器上,用VS打开: 会出现下面的界面,要想知道发生错误时候的调用栈,需要设置symbol的路径,点击”Set Symbol Paths“:

注意这个pdb要对应于crash的exe,否则调用栈没法显示:

设置完成后,点击”Debug with Native Only“ 你就可以看到调用栈了。

第二种: 改注册表

如果程序crash的时候没有框蹦出来,可以通过改注册表的设置让操作系统在程序crash的时候自动生成dump,并放到特定的目录下

[plain]?

view plain

copy

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows?Error?Reporting\LocalDumps?? Value?Name?=?DumpType?? Data?type:?REG_DWORD?? Value?Data?=?1??

其中Value Data=1代表的含义是:

[plain]?

view plain

copy

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

设置完成后,crash发生时,操作系统生成dump,路径在%LOCALAPPDATA%\CrashDumps下,详细可以参考:

http://www.sychzs.cn/en-us/library/bb787181%28v=VS.85%29.aspx

(完)

http://www.sychzs.cn/chinabinlang/article/details/49491813

0条大神的评论

发表评论

相关文章