1
私はWindowsシステムのBSODのためにミニダンプをいくつか持っています。WinDbgと "!analyze -v":BSODからミニダンプをプログラムで分析することは可能ですか?
私は手動で!analyze -v
拡張子を使用してのWinDbgでそれらを分析することができますが、私はそれをプログラム的にそれらを解析することが可能であるかどうかを知っていただきたいと思います。
分析を行うAPIはありますか?何かのように
ありがとうございます。
アレッサンドロ
編集:
私は、次のサンプルコードを追加します。私はそれを構築し、exeをWinDbgフォルダ(私のシステムでは%ProgramFiles%\WinDbg
)にコピーしてから、それをテストしました(Microsoft(R)Windows Debugger Version 6.11.0001.404 X86)。 WinDbg。
#include <dbgeng.h>
#include <atlbase.h>
#include <string>
#include <iostream>
// For class StdioOutputCallbacks see:
// http://blogs.msdn.com/b/sqlblog/archive/2009/12/30/tools-of-the-trade-part-iv-developing-windbg-extension-dlls.aspx
class StdioOutputCallbacks : public IDebugOutputCallbacks
{
private:
std::string m_OutputBuffer;
CHAR m_OutPutBuffer[4096];
public:
void InitOutPutBuffer();
std::string GetOutputBuffer()
{
return m_OutputBuffer;
};
void ClearOutPutBuffer()
{
m_OutputBuffer = "";
};
STDMETHOD(QueryInterface)(IN REFIID InterfaceId, OUT PVOID* Interface);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(Output)(IN ULONG Mask, IN PCSTR Text);
};
StdioOutputCallbacks g_OutputCb;
STDMETHODIMP StdioOutputCallbacks::QueryInterface(IN REFIID InterfaceId,
OUT PVOID* Interface)
{
*Interface = NULL;
if (IsEqualIID(InterfaceId, __uuidof(IUnknown)) ||
IsEqualIID(InterfaceId, __uuidof(IDebugOutputCallbacks)))
{
*Interface = (IDebugOutputCallbacks *)this;
AddRef();
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
STDMETHODIMP_(ULONG) StdioOutputCallbacks::AddRef()
{
// This class is designed to be static so
// there's no true refcount.
return 1;
}
STDMETHODIMP_(ULONG) StdioOutputCallbacks::Release()
{
// This class is designed to be static so
// there's no true refcount.
return 0;
}
STDMETHODIMP StdioOutputCallbacks::Output(IN ULONG Mask, IN PCSTR Text)
{
UNREFERENCED_PARAMETER(Mask);
m_OutputBuffer += Text;
return S_OK;
}
void StdioOutputCallbacks::InitOutPutBuffer()
{
m_OutputBuffer.erase();
}
int analyze(const char* dump_file)
{
// See: http://pwiki.pontetec.com/index.php?title=Hooking_Windbg&printable=yes
CComPtr<IDebugClient> client;
HRESULT hr = DebugCreate(__uuidof(IDebugClient),
reinterpret_cast<LPVOID*>(&client));
if (FAILED(hr)) return __LINE__;
CComQIPtr<IDebugControl> control(client);
if (!control) return __LINE__;
hr = client->SetOutputCallbacks(&g_OutputCb);
if (FAILED(hr)) return __LINE__;
CComQIPtr<IDebugSymbols> symbols(client);
if (!symbols) return __LINE__;
hr = symbols->SetSymbolPath("srv*http://msdl.microsoft.com/download/symbols");
if (FAILED(hr)) return __LINE__;
hr = client->OpenDumpFile(dump_file);
if (FAILED(hr)) return __LINE__;
// it seems it is always returning E_INVALIDARG... so we don't check hr
control->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE);
std::cout << "\n\n*** Output after loading the dump:\n\n";
std::cout << g_OutputCb.GetOutputBuffer().c_str();
g_OutputCb.ClearOutPutBuffer();
hr = control->Execute(DEBUG_OUTCTL_THIS_CLIENT |
DEBUG_OUTCTL_OVERRIDE_MASK |
DEBUG_OUTCTL_NOT_LOGGED,
"!analyze -v",
DEBUG_EXECUTE_DEFAULT);
if (FAILED(hr)) return __LINE__;
::Sleep(15000);
std::cout << "\n\n*** Output after the command `!analyze -v`:\n\n";
std::cout << g_OutputCb.GetOutputBuffer().c_str();
return 0;
}
int main(int argc, char* argv[])
{
HRESULT hr = CoInitialize(NULL);
int r = analyze(argv[1]);
CoUninitialize();
return r;
}
「ユーザモードのミニダンプファイルから」と言われて以来、うまくいくとは思えません。ダンプがカーネルモードであることを示すBSODを取得している場合。 – linuxuser27