Pregunta

¿Hay una manera de caer en el depurador cuando cualquier de pánico se produce como si hubiera un punto de ruptura?

Estoy usando Carbide.c ++ 2.3.0. Sé de los Configuraciones de depuración> x86 excepciones, pero cubre sólo una pequeña fracción de lo que en realidad puede ocurrir en una aplicación real. Por ejemplo, no entra en pánico trampa de usuario, o pánicos alloc cuando sale de la aplicación con pérdidas de memoria.

¿Fue útil?

Solución

Si está utilizando el emulador, se puede depurar entra en pánico al permitir 'depuración just-in-time. Esto se hace añadiendo la siguiente línea a epoc32\data\epoc.ini:

JustInTime debug

Para más detalles, ver la referencia epoc.ini en la documentación SDK .

Otros consejos

A lo mejor de mi conocimiento que no se puede hacer.

Lo que he hecho es el uso simple función trazando la lógica de modo que cuando ocurre una situación de pánico Tengo un seguimiento de la pila en el punto del pánico en mi el código de manejo de pánico (que cierro la sesión). Esto funciona bien excepto por el hecho de que usted tiene que recordar a añadir sus de macro al comienzo de cada función.

por ejemplo.

#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();
    ...
}

Para ALLOC de, he tenido mucho éxito con el Enganche Logger bajo el emulador. Es un verdadero dolor de configurar y usar, pero que hará que sea muy fácil de localizar pérdidas de memoria alloc.

ACTUALIZACIÓN: Según lo solicitado, esto es lo que el manejo de mi pánico miradas de códigos similares. Tenga en cuenta que mi solicitud ha de ejecutarse en segundo plano todo el tiempo, así que es de instalación se reinicie la aplicación cuando sucede algo malo. Además, este código funciona para 3rd Edition SDK, no he probado en versiones posteriores del SDK de.

El punto es para ejecutar la aplicación principal en otro hilo y luego esperar a que para salir. A continuación, comprobar para ver por qué el hilo termina, que el hilo como salido por razones desconocidas, cosas de registro como mi propio seguimiento de la pila y reinicie la aplicación.

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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top