Qt、Windowsで開発されたプロジェクトに取り組んでいます プロジェクトのコンパイルにQtバージョン4.1.4とVC6 IDEを使用していますが、ほとんどの製品の使用方法はWindowsXpにあります。Qtアプリケーションのクラッシュログの作成方法
私は頻繁に修正パターンを持たず、開発環境で再現しないテスターや顧客からのクラッシュレポートを受け取ります。
私は、プログラムからクラッシュログを書く必要があるので、プログラムがクラッシュしたときに常にコールスタックを取得する必要があります。
私は、セグメンテーションフォールトのシグナル処理をすることで可能性があることを知っています。しかし、Windows/C++で同じことをする方法は?
私はGoogleで検索して、いくつかの準備が整った解決策を見つけようとしましたが、運がありません。
サードパーティのツール/ライブラリ(無料またはライセンス)に関する提案も受け入れられますが、私のモジュールの各機能を変更してログを取得する必要がある方法は提案しないでください。余裕がない。
ありがとうございます。
更新。 私はStackWalkerをコードに添付しましたが(_MBCS & UNICODEのちょっとした不具合で)、atleastでそれを接続できました。
私のメインのファイルが
class MyStackWalker : public StackWalker
{
FILE *sgLogFile;
public:
MyStackWalker() : StackWalker()
{
sgLogFile = fopen("ThisIsWhatIcallLog.log", "w");
}
MyStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess)
{
}
virtual void OnOutput(LPCSTR szText)
{
printf(szText);
fprintf(sgLogFile, "%s",szText);
fclose(sgLogFile);
StackWalker::OnOutput(szText);
}
};
LONG Win32FaultHandler(struct _EXCEPTION_POINTERS * ExInfo)
{
MyStackWalker sw;
sw.ShowCallstack();
return EXCEPTION_EXECUTE_HANDLER;
}
void InstallFaultHandler()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) Win32FaultHandler);
}
、以下のように見えますが、私はUNICODEに適応するStackWalker.cppファイルを変更した
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall StackWalker::ShowCallstack(void *,struct _CONTEXT const *,int (__stdcall*)(void *,unsigned __int64,void *,int,unsigned long *,void *),void *)" ([email protected]@@[email protected]@[email protected]@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnDbgHelpErr(char const *,int,unsigned __int64)([email protected]@@[email protected])
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnLoadModule(char const *,char const *,unsigned __int64,int,int,char const *,char const *,unsigned __int64)" ([email protected]@@[email protected])
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnSymInit(char const *,int,char const *)" ([email protected]@@[email protected])
main.obj : error LNK2001: unresolved external symbol "public: __thiscall StackWalker::StackWalker(int,char const *,int,void *)" ([email protected]@[email protected]@Z)
release/Prog.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
、今のシンボルが見つからないことをリンカエラーを取得しますサポート、 "_tcscat_s"を "wcscat"に置き換えました。
ここで何が問題になっていますか?
ユーザーは予期しない動作を「クラッシュ」と呼びます。これには、ハング、グラフィカルな破損、さらには誤ったデータが含まれます。クラッシュログは真のクラッシュをキャプチャします。 – MSalters
こんにちはMSalters、返信いただきありがとうございます。はい、私は理解しています。「本当のクラッシュ」しかないと思います。残念ですが、バグ追跡システムでユーザーから提供された情報で管理できます – maxchirag