【发布时间】:2012-03-22 23:45:28
【问题描述】:
我不知道我没有在做什么,但我根本无法使用自己的调试器来保存正在调试的应用程序的“Mutex Owned”或“Mutex Free”信息。
如果我这样称呼它,CDB 可以正常工作:
cdb -pn test.exe -c ".dump /f /ma /u test.dmp;.detach;q"
当我在 WinDbg 中打开故障转储文件并键入以下命令时,我看到 Mutex Free 或 Mutex Owned 状态:
0:001> !handle 0 f Mutant
Handle 7f4
Type Mutant
Attributes 0
GrantedAccess 0x1f0001:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState
HandleCount 2
PointerCount 4
Name \BaseNamedObjects\PAUL_HANG_MUTEX
Object Specific Information
Mutex is Owned <--- THIS HERE IS WHAT I WANT TO SEE
下面是我的函数 - 我必须注释掉一些 MiniDumpWith 选项,因为除非我注释掉它们,否则它根本不会写入故障转储文件。
有人知道为什么我使用 /ma 时 CDB 可以保存信息,而我自己的代码却不能吗?
void WriteCrashDump( EXCEPTION_DEBUG_INFO *pExceptionInfo )
{
CONTEXT c;
memset( &c, 0, sizeof( c ) );
GetThreadContext( hThread, &c );
EXCEPTION_POINTERS ep;
memset( &ep, 0, sizeof( ep ) );
ep.ContextRecord = &c;
ep.ExceptionRecord = &pExceptionInfo->ExceptionRecord;
MINIDUMP_EXCEPTION_INFORMATION minidump_exception;
memset( &minidump_exception, 0, sizeof( minidump_exception ) );
minidump_exception .ThreadId = dwThreadId;
minidump_exception.ExceptionPointers = &ep;
minidump_exception.ClientPointers = true;
char txDumpPath[ MAX_PATH + 1 ];
sprintf( txDumpPath, "%s.dmp", txProcess );
HANDLE hFile = CreateFile( txDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile )
{
BOOL fSuccess;
SetLastError( 0L );
int nDumpOptions =
MiniDumpNormal
| MiniDumpWithDataSegs
| MiniDumpWithFullMemory
| MiniDumpWithHandleData
| MiniDumpFilterMemory
| MiniDumpScanMemory
| MiniDumpWithUnloadedModules
| MiniDumpWithIndirectlyReferencedMemory
| MiniDumpFilterModulePaths
| MiniDumpWithProcessThreadData
| MiniDumpWithPrivateReadWriteMemory
| MiniDumpWithoutOptionalData
//| MiniDumpWithFullMemoryInfo
//| MiniDumpWithThreadInfo
//| MiniDumpWithCodeSegs
//| MiniDumpWithoutManagedState
;
fSuccess = MiniDumpWriteDump( hProcess,
dwProcessId,
hFile,
(MINIDUMP_TYPE) nDumpOptions,
&minidump_exception,
NULL,
NULL );
DWORD dwErr = GetLastError();
if( ! fSuccess )
printf( "MiniDumpWriteDump -FAILED (LastError:%u)\n", dwErr );
CloseHandle( hFile );
}
}
【问题讨论】:
标签: c debugging windbg crash-dumps