[ alexione @ 07.03.2007. 10:56 ] @
Koristim Visual Studio 2005, i program se pri testiranju povremeno crash-uje, tester jos nije uspeo da otkrije tacan nacin za reprodukovanje problema. Na koji nacin mogu pri crash-u programa da dobijem stack trace, tj. informacije koje su mi izlistane u Call Stack-u? Hvatanje izuzetka je vec postavljeno, ono sto mi treba je nacin da iz LPEXCEPTION_POINTERS dobijem stack trace. Da li se neko vec bavio ovim problemom? Postoji li u bibliotekama za C++ koje se dobijaju uz VS gotovo resenje?

Hvala unapred!
[ tosa @ 09.03.2007. 12:33 ] @
Preuzeto iz MSND-a:
Code:
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>

int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
{
    BOOL bMiniDumpSuccessful;
    WCHAR szPath[MAX_PATH]; 
    WCHAR szFileName[MAX_PATH]; 
    WCHAR* szAppName = L"AppName";
    WCHAR* szVersion = L"v1.0";
    DWORD dwBufferSize = MAX_PATH;
    HANDLE hDumpFile;
    SYSTEMTIME stLocalTime;
    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

    GetLocalTime( &stLocalTime );
    GetTempPath( dwBufferSize, szPath );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
    CreateDirectory( szFileName, NULL );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s\\%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", 
               szPath, szAppName, szVersion, 
               stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, 
               stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, 
               GetCurrentProcessId(), GetCurrentThreadId());
    hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, 
                FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

    ExpParam.ThreadId = GetCurrentThreadId();
    ExpParam.ExceptionPointers = pExceptionPointers;
    ExpParam.ClientPointers = TRUE;

    bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 
                    hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);

    return EXCEPTION_EXECUTE_HANDLER;
}


void SomeFunction()
{
    __try
    {
        int *pBadPtr = NULL;
        *pBadPtr = 0;
    }
    __except(GenerateDump(GetExceptionInformation()))
    {
    }
}
[ alexione @ 10.03.2007. 14:06 ] @
Hvala, upravo to mi je trebalo. Inace, uspeo sam da nadjem resenje u medjuvremenu na http://www.codeproject.com/threads/StackWalker.asp
[ tosa @ 10.03.2007. 15:16 ] @
Mislim da ti to neće ni izbliza pokriti potrebe. Stack walker je odličan u sutuacijama
u kojima možeš da predvidiš pucanje programa, kao što je assert uslov koji nije prošao.
Pod uslovom da ne koristiš exception handlere.


[Ovu poruku je menjao tosa dana 11.03.2007. u 04:35 GMT+1]
[ alexione @ 10.03.2007. 22:23 ] @
Da, na asser-ima se StackWalker super pokazao. Probao sam ga, i radi posao i za integer-division-by-zero, null-pointer-access, pa pretpostavljam da ce dobro raditi i za ostale bad-pointer-access.
[ tosa @ 11.03.2007. 03:28 ] @
Pokriće ti praktično sve potrebe ako razvoj radiš individualno.
Ukoliko imaš ljude koji testiraju tvoju aplikaciju, mnogo je bolje da imaš i kreš
damp, zato što možeš da debaguješ problem koji se desio na tuđoj mašini, nećeš
imati samo informacije o mestu pucanja već i kompletno stanje programa u trenutku
kada se to desilo. Sve prema potrebama...