说说大家都怎么在VS2005下面定位CRASH具体行号?

icefoxy 2011-04-26 11:52:56
如题,因为我找了半天发现vs2005下不能支持行号 mapinfo:lines

http://www.vckbase.com/document/viewdoc/?id=1473
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2011-04-26
  • 打赏
  • 举报
回复
生成DUMP文件,这是定位Crash行的最有效办法。
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/

#ifndef INCLUDE_MINIDUMPER_H_
#define INCLUDE_MINIDUMPER_H_

#ifdef _MSC_VER

#include <string>

#include <windows.h>
#include <tchar.h>
#pragma comment(lib, "dbghelp.lib")

#include <dbghelp.h>
#pragma comment(lib, "user32.lib")

#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

namespace qp
{

typedef std::string StringA;
typedef std::wstring StringW;

#ifdef _UNICODE
typedef StringW String;
#else
typedef StringA String;
#endif // _UNICODE

typedef BOOL (WINAPI* PFNWRITEDUMP)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);

class MiniDumper
{
protected:
MiniDumper() { ::SetUnhandledExceptionFilter(&MiniDumper::TopLevelExceptionFilter); }
~MiniDumper() {};

private:
MiniDumper(const MiniDumper&);
const MiniDumper& operator=(const MiniDumper&);

public:
static MiniDumper* Get()
{
static MiniDumper dumper;
return &dumper;
}

void Init(const String& dumpFilePath = String(), const String& appVersion = _T("1.0.0.0"))
{
if (!dumpFilePath.empty() && ::PathIsDirectory(dumpFilePath.c_str()))
m_DumpFilePath = dumpFilePath;
else
{
TCHAR appPath[MAX_PATH];
::GetModuleFileName(NULL, appPath, MAX_PATH);
::PathRemoveFileSpec(appPath);
m_DumpFilePath = appPath;
}

m_AppVersion = appVersion;
}

String GetDumpFile() const
{
SYSTEMTIME st;
::GetLocalTime(&st);
TCHAR dt[11];
wsprintf(dt, _T("%02d%02d%02d%02d%02d"), st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

TCHAR appPath[MAX_PATH];
::GetModuleFileName(NULL, appPath, MAX_PATH);
::PathRemoveExtension(appPath);

String file(m_DumpFilePath);
file += _T("\\");
file += ::PathFindFileName(appPath);
file += _T("_") + m_AppVersion + _T("_");
file += dt;
file += _T(".dmp");
return file;
}

private:
static LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS* ep)
{
LONG ret = EXCEPTION_CONTINUE_SEARCH;

TCHAR dbgHelpDLL[MAX_PATH];
::GetModuleFileName(NULL, dbgHelpDLL, MAX_PATH);

::PathRemoveFileSpec(dbgHelpDLL);
::PathAppend(dbgHelpDLL, _T("dbghelp.dll"));

HMODULE module = ::LoadLibrary(dbgHelpDLL);
if (module == NULL)
return ret;

PFNWRITEDUMP MiniDumpWriteDump = (PFNWRITEDUMP)::GetProcAddress(module, "MiniDumpWriteDump");
if (MiniDumpWriteDump != NULL)
{
String dumpFile = MiniDumper::Get()->GetDumpFile();
HANDLE file = ::CreateFile(dumpFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
return ret;

_MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = ::GetCurrentThreadId();
mdei.ExceptionPointers = ep;
mdei.ClientPointers = NULL;

MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
/*MiniDumpWithFullMemoryInfo |*/
MiniDumpWithThreadInfo /*|
MiniDumpWithUnloadedModules*/);

if (MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), file, mdt, &mdei, NULL, NULL))
{
::MessageBox(NULL, dumpFile.c_str(), _T("Crash Report!"), MB_TOPMOST | MB_ICONSTOP);
const String openDmp(_T("/select,") + dumpFile);
::ShellExecute(NULL, _T("open"), _T("explorer.exe"), openDmp.c_str(), NULL, SW_SHOWNORMAL);
ret = EXCEPTION_EXECUTE_HANDLER;
}

CloseHandle(file);
}

return ret;
}

private:
String m_DumpFilePath;
String m_AppVersion;
};

} // namespace qp

#endif // _MSC_VER

#endif // INCLUDE_MINIDUMPER_H_
icefoxy 2011-04-26
  • 打赏
  • 举报
回复
谢谢大家!不过我对 DUMP,不是很熟悉。
子达如何 2011-04-26
  • 打赏
  • 举报
回复
如果目标运行的机器上有Dr.Watson的话,可以用它帮忙生成DUMP文件。拿回来用VC打开,配置一下对应到PDB文件和源代码文件也可以看到crash时候的行。关键是你编译的时候要产生了DEBUG信息。
zhonglingqqxh 2011-04-26
  • 打赏
  • 举报
回复
生成dump文件,保留pdb文件,使用windbg查看
luciferisnotsatan 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loaden 的回复:]

生成DUMP文件,这是定位Crash行的最有效办法。
C/C++ code
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/

#ifndef INCLUDE_MINIDUMPER_H_
#define INCLUDE_MINIDUMPER_H_

#ifdef _MSC_VER

#include <string>

#inclu……
[/Quote]
++
赵4老师 2011-04-26
  • 打赏
  • 举报
回复
查看调用堆栈

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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