Frage

Gibt es eine Möglichkeit in den Debugger fallen, wenn jeder Panik auftritt wie wenn es einen Haltepunkt waren?

Ich verwende Carbide.c ++ 2.3.0. Ich weiß, über die Debug-Konfigurationen> x86 Ausnahmen, aber es deckt nur einen kleinen Bruchteil von dem, was in einer realen Anwendung tatsächlich passieren kann. Zum Beispiel macht es Benutzer panics nicht Falle oder ALLOC gerät in Panik, wenn Anwendung beendet mit Speicherlecks.

War es hilfreich?

Lösung

Wenn Sie den Emulator verwenden, können Sie geraten in Panik debuggen, indem ermöglicht ‚Just-in-Time-Debugging. Dies wird durch Hinzufügen der folgenden Zeile zu epoc32\data\epoc.ini getan:

JustInTime debug

Weitere Informationen finden Sie in der epoc.ini Referenz in der SDK-Dokumentation .

Andere Tipps

Nach bestem Wissen und Gewissen es nicht getan werden kann.

Was ich getan habe, ist die Verwendung einfache Funktion Verfolgungslogik so, wenn eine Panik passiert Ich habe einen Stack-Trace an dem Punkt der Panik in meiner Panik Behandlungs-Code (das ich mich abmelde). Dies funktioniert gut für die Tatsache, außer dass Sie Ihre Makros zu Beginn jeder Funktion erinnern hinzuzufügen.

z.

#ifndef NDEBUG
class __FTrace
{
    __FTrace(const char* function)
    {
        TraceManager::GetInstance().EnterFunction(function);
    }
    ~__FTrace()
    {
        TraceManager::GetInstance().LeaveFunction(function);
    }
};    

#define FTRACE() __FTrace(__PRETTY_FUNCTION__)
#else
#define FTRACE()
#endif

void Func()
{
    FTRACE();
    ...
}

Für ALLOC ist, ich habe viel Erfolg mit dem hatte Haken Logger unter dem Emulator. Es ist ein echten Schmerzen zu installieren und zu verwenden, aber es wird es wirklich einfach machen Speicherlecks ALLOC aufzuspüren.

UPDATE: Wie gewünscht, hier ist das, was meine Panik wie Code sieht Handhabung. Beachten Sie, dass meine Anwendung hat im Hintergrund die ganze Zeit laufen zu lassen, so dass er das Setup die App neu zu starten, wenn etwas Schlimmes passiert. Auch dieser Code für 3rd Edition SDK funktioniert, ich habe es nicht auf neuere Versionen des SDK versucht.

Der Punkt ist die Hauptanwendung in einem anderen Thread laufen und dann warten, bis es zu verlassen. Dann überprüfen, um zu sehen, warum der Thread beendet, es den Faden wie aus unbekannten Gründen, lügen Sachen wie mein eigener Stack-Trace und starten Sie die Anwendung verlassen.

TInt StartMainThread(TAny*)
    {
    FTRACE();
    __LOGSTR_TOFILE("Main Thread Start");
    TInt result(KErrNone);

    TRAPD(err, result = EikStart::RunApplication(NewApplication));

    if(KErrNone != err || KErrNone != result )
        {
        __LOGSTR_TOFILE("EikStart::RunApplication error: trap(%d), %d", err, result);
        }

    __LOGSTR_TOFILE("Main Thread End");
    return result;
    }

const TInt KMainThreadToLiveInSeconds = 10;

} // namespace *unnamed*

LOCAL_C CApaApplication* NewApplication()
    {
    FTRACE();
    return new CMainApplication;
    }


GLDEF_C TInt E32Main()
    {
#ifdef NDEBUG
    __LOGSTR_TOFILE("Application Start (release)");
#else   
    __LOGSTR_TOFILE("Application Start (debug)");
#endif  

#ifndef NO_TRACING
    __TraceManager::NewL();
#endif // !NO_TRACING

    RHeap& heap(User::Heap());
    TInt heapsize=heap.MaxLength();

    TInt exitReason(KErrNone);

    TTime timeToLive;
    timeToLive.UniversalTime();
    timeToLive += TTimeIntervalSeconds(KMainThreadToLiveInSeconds);

    LManagedHandle<RThread> mainThread;
    TInt err = mainThread->Create(_L("Main Thread"), StartMainThread, KDefaultStackSize, KMinHeapSize, heapsize, NULL);
    if (KErrNone != err) 
        {
        __LOGSTR_TOFILE("MainThread failed : %d", err);
        return err;
        }

    mainThread->SetPriority(EPriorityNormal);
    TRequestStatus status; 
    mainThread->Logon(status);

    mainThread->Resume();

    User::WaitForRequest(status);

    exitReason = mainThread->ExitReason();
TExitCategoryName category(mainThread->ExitCategory());

switch(mainThread->ExitType())
    {
    case EExitKill:
        __LOGSTR_TOFILE("ExitKill : (%S) : %d", &category, exitReason);
        break;

    case EExitTerminate:
        __LOGSTR_TOFILE("ExitTerminate : (%S) : %d", &category, exitReason);
        break;

    case EExitPanic:
        __LOGSTR_TOFILE("ExitPanic : (%S) : %d", &category, exitReason);
        break;

    default:
        __LOGSTR_TOFILE("ExitUnknown : (%S) : %d", &category, exitReason);
        break;
    }

#ifndef NO_TRACING
    __TraceManager::GetInstance().LogStackTrace();
#endif // NO_TRACING


    if( KErrNone != status.Int() )
        {
        TTime now;
        now.UniversalTime();

        if (timeToLive > now)
            {
            TTimeIntervalMicroSeconds diff = timeToLive.MicroSecondsFrom(now);
            __LOGSTR_TOFILE("Exiting due to TTL : (%Lu)", diff.Int64());
            }
        else
            {
            RProcess current;
            RProcess restart;
            err = restart.Create(current.FileName(), _L(""));
            if( KErrNone == err )
                {
                __LOGSTR_TOFILE("Restarting...");
                restart.Resume();
                return KErrNone;
                }
            else
                {
                __LOGSTR_TOFILE("Failed to start app: %d", err);
                }
            }
        }

    __LOGSTR_TOFILE("Application End");
    return exitReason;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top