【问题标题】:Debugger: How do I get "Mutex Owned" or "Mutex Free" info in a crash dump?调试器:如何在故障转储中获取“Mutex Owned”或“Mutex Free”信息?
【发布时间】: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


    【解决方案1】:

    即使带有标志 MiniDumpWithHandleData,它是否不包含互斥锁信息,它也可能失败,因为某些标志可能与您调用的 DebugHlp.dll 版本不兼容。见MINIDUMP_TYPE enumeration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多