MiniDumpWriteDump生成的dump文件用什么打开?

tserpent 2009-12-25 08:48:50
我用windbg打开,找不到正确的堆栈信息,堆栈都不是指向自己的代码的?

我把把符号目录指到我的pdb,exe目录了,我把源文件目录指到我的源文件目录
我用的命令是,!analyze -v 和kb,kp,看到的堆栈都不是我自己的代码的

反而我不用MiniDumpWriteDump,让drwtsn32来生成代码,反而可以看到我的代码的函数。

???是不是我哪里搞错了,随便我的操作系统是XP3,开发工具是VC6.0,好像不能打开dump文件

再问一下,我要把程序考到2003 Server上运行,然后再生成dump文件来分析,
需要做什么准备,比如pdb怎么弄。

希望有朋友指点下,谢谢了!
...全文
1249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
paopaoc 2010-01-18
  • 打赏
  • 举报
回复
看来楼主始终没明白你的dump文件打不开,或者是打开后不能自动找到正确出错代码行的原因。
其实它的根本原因就在于,你生成的dump文件有问题....
masterz 2010-01-09
  • 打赏
  • 举报
回复
Visual Studio 2008也可以打开
xwsn007 2010-01-08
  • 打赏
  • 举报
回复
WinDbg
"file"->"open crash dump"
paopaoc 2010-01-08
  • 打赏
  • 举报
回复
我把写过的程序中的一段代码给你抠出来了,希望对你有所帮助(因为去除了部分代码,且未测试,可能有错误,你参考一下就行了)

#define DUMP_TYPE MiniDumpWithFullMemory | MiniDumpWithDataSegs | MiniDumpWithHandleData \
| MiniDumpWithProcessThreadData | MiniDumpScanMemory | MiniDumpWithIndirectlyReferencedMemory

EXTERN_C unsigned int __stdcall WriteDump(LPVOID pArg)
{
HRESULT hrCode = E_FAIL;
BOOL bRetVal = FALSE;

HANDLE hFile = INVALID_HANDLE_VALUE;
LPWSTR lpwszDumpFile = NULL;
LPWSTR lpwszFileName = NULL;
WCHAR wszTime[MAX_STRING_TIME_SIZE] = { 0 };
DWORD dwPID = 0;

PEXCEPTION_POINTERS pExceptionInfo = NULL;
MINIDUMP_EXCEPTION_INFORMATION MiniExceptionInfo = { 0 };

lpwszDumpFile = (LPWSTR)malloc(MAX_PATH * sizeof(WCHAR));
_ASSERT(lpwszDumpFile);

dwPID = GetCurrentProcessId();
hrCode = StringCchCopy(lpwszDumpFile, MAX_PATH, L"C:\\Mydump.dmp");
_ASSERT(S_OK == hrCode);

pExceptionInfo = (PEXCEPTION_POINTERS)pArg;

hFile = CreateFile(
lpwszDumpFile,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (INVALID_HANDLE_VALUE != hFile)
{
//Fill MiniDumpInfo structure variable
MiniExceptionInfo.ThreadId = GetCurrentThreadId();
MiniExceptionInfo.ExceptionPointers = pExceptionInfo;
MiniExceptionInfo.ClientPointers = TRUE;

bRetVal = MiniDumpWriteDump(
GetCurrentProcess(),
dwPID,
hFile,
static_cast<MINIDUMP_TYPE>(DUMP_TYPE),
&MiniExceptionInfo,
NULL,
NULL
);

CloseHandle(hFile);
}

if (lpwszDumpFile)
{
free(lpwszDumpFile);
lpwszDumpFile = NULL;
}

return 0;
}

LONG WINAPI UnhandledFilterFunction(PEXCEPTION_POINTERS pExceptionInfo)
{
int nRetVal = 0;

HANDLE hThread = NULL;
unsigned int uTID = 0;

hThread = (HANDLE)_beginthreadex(
NULL,
0,
WriteDump,
pExceptionInfo,
0,
&uTID
);
WaitForSingleObject(hThread, 30 * 1000);
CloseHandle(hThread);

::TerminateProcess(GetCurrentProcess(), 5);

return nRetVal;
}

在主程序的main函数中调用:
SetUnhandledExceptionFilter(UnhandledFilterFunction);

然后就可以捕捉程序自己本身的dump了。
arong1234 2009-12-25
  • 打赏
  • 举报
回复
你不用试了,mini dump本来就没有多少有用的信息
[Quote=引用 8 楼 tserpent 的回复:]
我的程序是个多线程的,会不会是生成的dump信息不是exception的那个线程的堆栈哦
我写dump文件的时候用的是
GetCurrentProcess(), GetCurrentProcessId()
[/Quote]
oyljerry 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tserpent 的回复:]
我的程序是个多线程的,会不会是生成的dump信息不是exception的那个线程的堆栈哦
我写dump文件的时候用的是
GetCurrentProcess(), GetCurrentProcessId()
[/Quote]
最好产生整个进程所有线程的dump..
tserpent 2009-12-25
  • 打赏
  • 举报
回复
我的程序是个多线程的,会不会是生成的dump信息不是exception的那个线程的堆栈哦
我写dump文件的时候用的是
GetCurrentProcess(), GetCurrentProcessId()
arong1234 2009-12-25
  • 打赏
  • 举报
回复
pdb是你编译这个可执行文件时编译器生成的,不需要你弄
[Quote=引用楼主 tserpent 的回复:]
  我用windbg打开,找不到正确的堆栈信息,堆栈都不是指向自己的代码的?

  我把把符号目录指到我的pdb,exe目录了,我把源文件目录指到我的源文件目录
  我用的命令是,!analyze -v 和kb,kp,看到的堆栈都不是我自己的代码的

  反而我不用MiniDumpWriteDump,让drwtsn32来生成代码,反而可以看到我的代码的函数。

  ???是不是我哪里搞错了,随便我的操作系统是XP3,开发工具是VC6.0,好像不能打开dump文件

  再问一下,我要把程序考到2003 Server上运行,然后再生成dump文件来分析,
  需要做什么准备,比如pdb怎么弄。

  希望有朋友指点下,谢谢了!
[/Quote]
zoulie 2009-12-25
  • 打赏
  • 举报
回复
windbg->file->open crash dump
arong1234 2009-12-25
  • 打赏
  • 举报
回复
minidump的信息本来就不足,要想查dump,还是需要full dump
wenqinwuhai 2009-12-25
  • 打赏
  • 举报
回复
WINDBG
oyljerry 2009-12-25
  • 打赏
  • 举报
回复
可能产生的mini dump不对...
MoXiaoRab 2009-12-25
  • 打赏
  • 举报
回复
pdb文件你在编译了你的源代码后,目录中不就会生成的么
把那个pdb文件所在的目录写在WinDbg的符号目录设置中
MoXiaoRab 2009-12-25
  • 打赏
  • 举报
回复
用WinDbg打开啊

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧