程序崩溃时,怎么得到调用栈?有什么API可以用?
程序崩溃时,怎么得到调用栈?我看到有人能够得到调用栈的详细信息,包括函数名,参数值,而且大部分是准确的。如果答案是MSJExceptionHandler就免了,请达人赐教! 问题点数:20、回复次数:19Top
1 楼fatacy(fatacy)回复于 2006-07-04 09:26:51 得分 0
自己up一下Top
2 楼hxzb7215191(天行健,君子以自强不息)回复于 2006-07-04 09:50:31 得分 0
mark 一下,呵呵.
学习Top
3 楼xx_jj()回复于 2006-07-04 09:51:19 得分 0
调试啊Top
4 楼fatacy(fatacy)回复于 2006-07-04 09:57:32 得分 0
release版的,只在客户机上出现Top
5 楼fatacy(fatacy)回复于 2006-07-04 14:41:59 得分 0
还没有答案,别沉啊Top
6 楼yellowdawnhlm(bourne)回复于 2006-07-04 15:31:36 得分 10
release版本必须要有pdb文件才可以获取到是具体的崩溃行地址,codeproject上面有一篇文章,你可以去搜索一下。Top
7 楼fatacy(fatacy)回复于 2006-07-04 15:49:45 得分 0
多谢,但还需要更多信息,比如调用栈,因为有时候错误并不是出在罪顶层调用。Top
8 楼dch4890164(巴拉克)回复于 2006-07-04 16:26:23 得分 0
捕获异常不行吗?Top
9 楼fatacy(fatacy)回复于 2006-07-04 17:34:59 得分 0
可以捕获异常,但关键是不知道哪里出错,也就不知道怎么修改问题Top
10 楼fatacy(fatacy)回复于 2006-07-05 10:50:50 得分 0
知道怎么trace call stack了,但仍然不知道怎么得到每个函数名,参数名?Top
11 楼he_sl(he_sl)回复于 2006-07-05 10:54:36 得分 0
关注Top
12 楼LuoMuFeng(罗穆峰)回复于 2006-07-05 14:22:43 得分 0
Release版中是不包含函数名、参数名、变量名等信息的,我劝楼主不要白费力气了。
除非你自己在代码中把这些信息记录下来。呵呵。Top
13 楼Stefine(CSDN最菜滴猩猩)回复于 2006-07-05 17:31:21 得分 0
根据崩溃时的异常信息可以判断一部分
比如有时数据库连接有问题时都会报相应的错误代码,及一些附加的说明
最好的方式应该是看清代码,找出可疑之处 下断点跟踪或用throw catchTop
14 楼lineuser(蓝冰)回复于 2006-07-27 08:54:44 得分 0
我也在找这个,有点话一起分享阿Top
15 楼wenbo_ying(应)回复于 2006-07-27 10:00:08 得分 0
用minidump
在app的InitInstance()中调用
::SetUnhandledExceptionFilter(TopLevelFilter);
定义TopLevelFilter:
LONG WINAPI TopLevelFilter( struct _EXCEPTION_POINTERS *pExceptionInfo )
{
LONG ret = EXCEPTION_CONTINUE_SEARCH;
CString strDumpFile;
CTime tmNow = CTime::GetCurrentTime();
strDumpFile += tmNow.Format("%m%d %H%M%S");
strDumpFile += ".dmp";
HANDLE hFile = ::CreateFile(strDumpFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile!=INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = pExceptionInfo;
ExInfo.ClientPointers = NULL;
// write the dump
BOOL bOK = MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );
ret = EXCEPTION_EXECUTE_HANDLER;
ReStart(FALSE);//重启程序
::CloseHandle(hFile);
}
return ret;
}
需要用到dbghelp.dll,dbghelp.lib,dbghelp.h,在VS2005下面有的
编译的时候,要生成pdb文件
然后用windbg就能看到当时的调用栈Top
16 楼BeRoy(失眠)回复于 2007-02-07 10:14:20 得分 0
学习Top
17 楼xingboy()回复于 2007-02-08 11:44:48 得分 0
STACKFRAME CallStack;
ZeroMemory( &CallStack, sizeof(CallStack) );
CallStack.AddrPC.Offset = ct.Eip;
CallStack.AddrStack.Offset = ct.Esp;
CallStack.AddrFrame.Offset = ct.Ebp;
CallStack.AddrPC.Mode = AddrModeFlat;
CallStack.AddrStack.Mode = AddrModeFlat;
CallStack.AddrFrame.Mode = AddrModeFlat;
while(StackWalk( IMAGE_FILE_MACHINE_I386, DebugProcessInfo.ProcessInfo.hProcess, hThread, &CallStack,
NULL, NULL, SymFunctionTableAccess, SymGetModuleBase, NULL ))
{
if( (DWORD)CallStack.AddrReturn.Offset>CodeImageBase && (DWORD)CallStack.AddrReturn.Offset<CodeImageEnd )
{
return CallStack.AddrReturn.Offset;
}
}Top
18 楼yjgx007(还不结帖?!听妈妈的话! http://www.geekclaw.com)回复于 2007-02-08 11:52:19 得分 10
http://www.codeproject.com/threads/StackWalker.aspTop
19 楼wangk(倒之)回复于 2007-02-08 12:27:49 得分 0
AfxDumpStackTop




