2011-08-08 23 views
4

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"に置き換えました。

ここで何が問題になっていますか?

+0

ユーザーは予期しない動作を「クラッシュ」と呼びます。これには、ハング、グラフィカルな破損、さらには誤ったデータが含まれます。クラッシュログは真のクラッシュをキャプチャします。 – MSalters

+0

こんにちはMSalters、返信いただきありがとうございます。はい、私は理解しています。「本当のクラッシュ」しかないと思います。残念ですが、バグ追跡システムでユーザーから提供された情報で管理できます – maxchirag

答えて

3

クロスプラットフォームアプリケーションの場合は、おそらくブレイクパッドが優れたソリューションです。しかし、Windowsの簡単な方法 - SetUnhandledExceptionFilterで未処理の例外ハンドラを設定し、ハンドラにWriteMiniDumpExを指定してミニダンプ(必要な設定で)を書き込むことです。

+0

こんにちは、私はSetUnHandledExceptionFilterに基づいていくつかのソリューションを試しましたが、彼らは多くを助けていないようだ、Googleのブレイクパッドは非常にクラッシュログ(それはセットアップサーバーなどのように、基本的に貧弱なドキュメント) Qt + Windowsで特に使いやすいのは本当に良いでしょう。まだ良い答えを探しています – maxchirag

+0

例へのリンクが追加されました。あなたがチェックする2つのもの。まず、dbghelp.dllがインストールされていますか?古いMSオペレーティングシステムにはインストールされていないため、アプリケーションと共に配布する必要があります。 2番目 - QTが未処理の例外(QTハンドラのTopLevelFilter(0)を手動で処理する場合)を処理しないことを確認してください。例外情報でなければスタックを取得します。 – elevener

3

Google Breakpadは、クロスプラットフォームのクラッシュレポートライブラリです。

スタックトレースを取得するためのいくつかのウィンドウ専用コードについては、StackWalkerも参照してください。

また、QCoreApplication::notifyをオーバーライドしてイベントフィルタをインストールし、すべての例外(Windows上でスタックオーバーフローやアクセス違反などの非同期の例外を含む)をキャッチすることをお勧めします。

+0

まずGoogleブレイクパッドを試してみましょう。最高の希望、他の賢明な私はQCoreApplicaton :: notify、行くだろう...とにかくお返事ありがとうございます – maxchirag

+0

もう一度、私はSetUnHandledExceptionFilterに基づいていくつかのソリューションを試してみましたが、彼らは多くを助けていないようです、Googleのブレッドパッドは非常にクラッシュログを取得する面で複雑に思える(それはセットアップのサーバーなどのように、ドキュメント)Qt + Windowsでシンプルで使いやすいものは本当に良いでしょう。まだ良い答えを探しています – maxchirag

+0

@maxchirag:あなたのQtアプリケーションに統合できるはずのWindows用のソリューションへのリンクを追加しました。 – Macke

関連する問題