Windows 2003サーバーにCOM +経由でネイティブC++アプリケーションを実行しています。私は最近、イベントビューアから例外をスローすること、特にhttp://blogs.msdn.com/calvin_hsia/archive/2004/06/30/170344.aspxによれば、そのプロセスがそのアドレススペース内ではなく、アクセス違反としてメモリに書き込もうとしているというC0000005の例外があることに気づいた。コールスタックを読み取るには?
イベントビューア内のエントリは、コールスタックを提供します。
LibFmwk UTIL_GetDateFromLogByDayDirectory(char型のconst *、クラスutilCDate &)+ 0xa26c LibFmwk UTIL_GetDateFromLogByDayDirectory(char型のconst *、クラスutilCDate &)+ 0x8af4 ! LibFmwk!UTIL_GetDateFromLogByDayDirectory(char型のconst *、クラスutilCDate &)+ 0x13a1 LibFmwk!utilCLogController :: GetFLFInfoLevel(無効)のconst + 0x1070 LibFmwk!utilCLogController :: GetFLFInfoLevel(無効)のconst + 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年以上前に書かれたコードであります私は、これが何をしているのか正確に知っているとは思っていませんが、ログディレクトリの名前を「Today」から特定の日付に変更するプロセスに関わっています。 %20090329配列の索引付け、memcpy、および演算子のアドレスは、それが疑わしいものに見えるようにします。
この問題は、本番システムでのみ発生するため、ここでテストシステムや開発システムで再現できなかったため、デバッガを接続することができませんでした。
非常に高く評価されました! アンディ
デバッグシンボルを使用してビルドすると、バイトオフセットではなく実際の行番号が得られる可能性があります。 –
それを指摘してくれてありがとう。 –
渡されるpszDirの長さが10文字以上であることを確認してください。そうでない場合は間違いなくクラッシュします。 – jussij