我們必須通過COM +運行在Windows 2003服務器上的本地C++應用程序。我最近在事件查看器注意到,其拋出異常,特別是異常C0000005,其中,根據http://blogs.msdn.com/calvin_hsia/archive/2004/06/30/170344.aspx意味着進程試圖寫入內存而不是它的地址空間內,又名訪問衝突。如何讀取調用堆棧?
在事件查看器中的條目提供了一個調用堆棧:
LibFmwk UTIL_GetDateFromLogByDayDirectory(字符常量*,類utilCDate &)+ 0xa26c LibFmwk UTIL_GetDateFromLogByDayDirectory(字符常量*,類utilCDate &)+ 0x8af4 ! LibFmwk!UTIL_GetDateFromLogByDayDirectory(字符常量*,類utilCDate &)+ 0x13a1 LibFmwk!utilCLogController :: GetFLFInfoLevel(無效)常量+ 0x1070 LibFmwk!utilCLogController :: GetFLFInfoLevel(無效)常量+ 0x186
現在
,據我所知,它給我的方法名去看看,但我得到一個感覺,在每行的末尾地址(例如+ 0xa26c)試圖將我指向該方法中的特定行或指令。
所以我的問題是:
- 有誰知道我可能會使用這個地址或任何其他信息在調用堆棧,以確定其翻倒在代碼中的哪條線路?
- 是否有任何資源在那裏,我可以讀更好地瞭解調用棧,
- 是否有任何免費/開源工具,可以在分析調用堆棧,幫助可能通過附加到調試符號文件和/或二進制?
編輯: 按照要求,在這裏,似乎是導致該問題的方法:由我們公司的一員
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);
}
這是代碼寫在10年前這個人早已離開了,所以我並不想知道這是做什麼,但我確實知道它參與了將日誌目錄從「今日」重命名爲特定日期的過程,例如%20090329。操作符的數組索引,memcpy和地址確實使其看起來頗爲可疑。
我們似乎有另一個問題是,這只是發生在生產系統上,我們從來沒有能夠重現它在我們的測試系統或開發系統在這裏,這將允許我們附加一個調試器。
非常感謝! 安迪
如果使用調試符號構建,您可能會得到實際的行號,而不是字節偏移量。 – 2009-07-31 11:07:00
謝謝你指出。 – 2009-07-31 11:20:23
那麼你確定傳入的pszDir至少有10個字符長嗎?如果情況並非如此,它肯定會崩潰。 – jussij 2009-08-04 01:05:25