首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Carbide.c++在Symbian操作系统中调试恐慌

使用Carbide.c++在Symbian操作系统中调试恐慌
EN

Stack Overflow用户
提问于 2010-08-26 13:13:17
回答 2查看 993关注 0票数 2

如果出现任何恐慌,比如有断点,是否有一种进入调试器的方法?

我使用的是Carbide.c++ 2.3.0。我知道调试配置> x86异常,但它只涵盖了实际应用程序中实际可能发生的事情的一小部分。例如,当应用程序因内存泄漏而退出时,它不会捕获用户恐慌或ALLOC恐慌。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-31 15:44:09

如果您正在使用模拟器,您可以通过启用“即时调试”来调试恐慌。

代码语言:javascript
复制
JustInTime debug

有关更多细节,请参见SDK文档中的epoc.ini引用

票数 2
EN

Stack Overflow用户

发布于 2010-08-27 10:56:16

据我所知,这是做不到的。

我所做的是使用简单的函数跟踪逻辑,所以当恐慌发生时,我在我的恐慌处理代码(我注销)中的恐慌点有一个堆栈跟踪。这很好,除非您必须记住在每个函数开始时添加宏。

例如:

代码语言:javascript
复制
#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();
    ...
}

对于ALLOC,我在模拟器下使用钩式记录仪取得了很大的成功。这是一个真正的痛苦设置和使用,但它将使它真正容易跟踪ALLOC内存泄漏。

更新:按照要求,下面是我的恐慌性处理代码。请注意,我的应用程序必须一直在后台运行,所以当发生了一些不好的事情时,就可以重新启动应用程序了。另外,这段代码也适用于第三版SDK,我还没有在SDK的后期版本上尝试过。

关键是在另一个线程中运行主应用程序,然后等待它退出。然后检查线程为什么退出,它是由于未知原因退出的线程,记录我自己的堆栈跟踪之类的内容,然后重新启动应用程序。

代码语言:javascript
复制
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;
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3575371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档