post changes after merging BS1.7.4
Remove tracking etc..
This commit is contained in:
@@ -38,7 +38,7 @@ CStackWalker::~CStackWalker(void)
|
||||
BOOL CStackWalker::LoadSymbol()
|
||||
{
|
||||
//USES_CONVERSION;
|
||||
//ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
//只加载一次
|
||||
if(m_bSymbolLoaded)
|
||||
{
|
||||
return m_bSymbolLoaded;
|
||||
@@ -51,11 +51,11 @@ BOOL CStackWalker::LoadSymbol()
|
||||
return m_bSymbolLoaded;
|
||||
}
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
||||
//添加当前程序路径
|
||||
TCHAR szSymbolPath[MAX_SYMBOL_PATH] = _T("");
|
||||
StringCchCopy(szSymbolPath, MAX_SYMBOL_PATH, _T(".;"));
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
|
||||
//添加程序所在目录
|
||||
TCHAR szTemp[MAX_PATH] = _T("");
|
||||
if (GetCurrentDirectory(MAX_PATH, szTemp) > 0)
|
||||
{
|
||||
@@ -63,7 +63,7 @@ BOOL CStackWalker::LoadSymbol()
|
||||
StringCchCat(szSymbolPath, MAX_SYMBOL_PATH, _T(";"));
|
||||
}
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
||||
//添加程序主模块所在路径
|
||||
ZeroMemory(szTemp, MAX_PATH * sizeof(TCHAR));
|
||||
if (GetModuleFileName(NULL, szTemp, MAX_PATH) > 0)
|
||||
{
|
||||
@@ -131,7 +131,7 @@ BOOL CStackWalker::LoadSymbol()
|
||||
|
||||
if (NULL != m_lpszSymbolPath)
|
||||
{
|
||||
m_bSymbolLoaded = SymInitialize(m_hProcess, textconv_helper::T2A_(m_lpszSymbolPath), TRUE); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTRUE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD>ű<EFBFBD>
|
||||
m_bSymbolLoaded = SymInitialize(m_hProcess, textconv_helper::T2A_(m_lpszSymbolPath), TRUE); //这里设置为TRUE,让它在初始化符号表的同时加载符号表
|
||||
}
|
||||
|
||||
DWORD symOptions = SymGetOptions();
|
||||
@@ -167,7 +167,7 @@ void CStackWalker::FreeModuleInformations(LPMODULE_INFO pmi)
|
||||
|
||||
LPMODULE_INFO CStackWalker::GetModulesTH32()
|
||||
{
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Toolhelp.dll Ӱ<><D3B0><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>ö<EFBFBD>̬<EFBFBD><CCAC><EFBFBD>صķ<D8B5>ʽ
|
||||
//这里为了防止加载Toolhelp.dll 影响最终结果,所以采用动态加载的方式
|
||||
LPMODULE_INFO pHead = NULL;
|
||||
LPMODULE_INFO pTail = pHead;
|
||||
|
||||
@@ -391,13 +391,13 @@ void CStackWalker::GetModuleInformation(LPMODULE_INFO pmi)
|
||||
LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
|
||||
{
|
||||
//USES_CONVERSION;
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD>ű<EFBFBD>
|
||||
//加载符号表
|
||||
LoadSymbol();
|
||||
|
||||
LPSTACKINFO pHead = NULL;
|
||||
LPSTACKINFO pTail = pHead;
|
||||
|
||||
//<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD>̵߳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||
//获取当前线程的上下文环境
|
||||
CONTEXT c = {0};
|
||||
if (context == NULL)
|
||||
{
|
||||
@@ -411,7 +411,7 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
|
||||
}
|
||||
else
|
||||
{
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD>̣߳<EFBFBD><EFBFBD><EFBFBD>ҪֹͣĿ<EFBFBD><EFBFBD><EFBFBD>̣߳<EFBFBD><EFBFBD>Ա<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>Ķ<EFBFBD>ջ<EFBFBD><EFBFBD>Ϣ
|
||||
//如果不是当前线程,需要停止目标线程,以便取出正确的堆栈信息
|
||||
SuspendThread(hThread);
|
||||
memset(&c, 0, sizeof(CONTEXT));
|
||||
c.ContextFlags = CONTEXT_FULL;
|
||||
@@ -446,7 +446,7 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
|
||||
sf.AddrFrame.Mode = AddrModeFlat;
|
||||
sf.AddrStack.Offset = c.Rsp;
|
||||
sf.AddrStack.Mode = AddrModeFlat;
|
||||
////intel Itanium(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
////intel Itanium(安腾)
|
||||
#elif _M_IA64
|
||||
imageType = IMAGE_FILE_MACHINE_IA64;
|
||||
sf.AddrPC.Offset = c.StIIP;
|
||||
@@ -490,7 +490,7 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
|
||||
StringCchCopy(pCallStack->undName, STACKWALK_MAX_NAMELEN, textconv_helper::A2T_(szName));
|
||||
}else
|
||||
{
|
||||
//<EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>487(<28><>ַ<EFBFBD><D6B7>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>û<EFBFBD>з<EFBFBD><D0B7>ʵ<EFBFBD>Ȩ<EFBFBD>ޡ<EFBFBD><DEA1>ڷ<EFBFBD><DAB7>ű<EFBFBD><C5B1><EFBFBD>δ<EFBFBD>ҵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ)
|
||||
//调用错误一般是487(地址无效或者没有访问的权限、在符号表中未找到指定地址的相关信息)
|
||||
this->OutputString(_T("Call SymGetSymFromAddr64 ,Address %08x Error:%08x\r\n"), sf.AddrPC.Offset, GetLastError());
|
||||
continue;
|
||||
}
|
||||
@@ -505,7 +505,7 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
|
||||
continue;
|
||||
}
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˽<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>û<EFBFBD><EFBFBD>ڲ鿴ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//这里为了将获取函数信息失败的情况与正常的情况一起输出,防止用户在查看时出现误解
|
||||
this->OutputString(_T("%08llx:%s [%s][%ld]\r\n"), pCallStack->szFncAddr, pCallStack->undFullName, pCallStack->szFileName, pCallStack->uFileNum);
|
||||
if (NULL == pHead)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user