事件查看器中的条目提供了一个调用堆栈:
现在,我明白它给我提供了要查看的方法名称,但是我有一种感觉,每行末尾的地址(例如+0xa26c)试图指向该方法中的特定行或指令。LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const *,class utilCDate &)+ 0xa26c LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const *,class utilCDate &)+ 0x8af4 LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const *,class utilCDate &)+ 0x13a1 LibFmwk!utilCLogController :: GetFLFInfoLevel(void)const + 0x1070 LibFmwk!utilCLogController :: GetFLFInfoLevel(void)const + 0x186
所以我的问题是:
- 是否有人知道我如何使用此地址或调用堆栈中的任何其他信息来确定代码中的哪一行出现了错误?
- 是否有任何资源可供我阅读以更好地理解调用堆栈?
- 是否有任何免费软件/开源工具可以帮助分析调用堆栈,例如通过连接到调试符号文件和/或二进制文件?
BOOL UTIL_GetDateFromLogByDayDirectory(LPCSTR pszDir, utilCDate& oDate)
{
BOOL bRet = FALSE;
if ((pszDir[0] == '%') &&
::isdigit(pszDir[1]) && ::isdigit(pszDir[2]) &&
::isdigit(pszDir[3]) && ::isdigit(pszDir[4]) &&
::isdigit(pszDir[5]) && ::isdigit(pszDir[6]) &&
::isdigit(pszDir[7]) && ::isdigit(pszDir[8]) &&
!pszDir[9])
{
char acCopy[9];
::memcpy(acCopy, pszDir + 1, 8);
acCopy[8] = '\0';
int iDay = ::atoi(&acCopy[6]);
acCopy[6] = '\0';
int iMonth = ::atoi(&acCopy[4]);
acCopy[4] = '\0';
int iYear = ::atoi(&acCopy[0]);
oDate.Set(iDay, iMonth, iYear);
bRet = TRUE;
}
return (bRet);
}
这是公司某位已离职成员十年前编写的代码,因此我不确定它的确切作用,但我知道它涉及将日志目录从“Today”重命名为特定日期,例如%20090329的过程。数组索引、memcpy和地址运算符使它看起来相当可疑。另一个问题是,这只在生产系统上发生,我们从未能够在测试系统或开发系统上复现它,这使我们无法附加调试器。
非常感谢! 安迪