如果出现任何恐慌,比如有断点,是否有一种进入调试器的方法?
我使用的是Carbide.c++ 2.3.0。我知道调试配置> x86异常,但它只涵盖了实际应用程序中实际可能发生的事情的一小部分。例如,当应用程序因内存泄漏而退出时,它不会捕获用户恐慌或ALLOC恐慌。
发布于 2010-08-31 15:44:09
如果您正在使用模拟器,您可以通过启用“即时调试”来调试恐慌。
JustInTime debug有关更多细节,请参见SDK文档中的epoc.ini引用。
发布于 2010-08-27 10:56:16
据我所知,这是做不到的。
我所做的是使用简单的函数跟踪逻辑,所以当恐慌发生时,我在我的恐慌处理代码(我注销)中的恐慌点有一个堆栈跟踪。这很好,除非您必须记住在每个函数开始时添加宏。
例如:
#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的后期版本上尝试过。
关键是在另一个线程中运行主应用程序,然后等待它退出。然后检查线程为什么退出,它是由于未知原因退出的线程,记录我自己的堆栈跟踪之类的内容,然后重新启动应用程序。
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;
}https://stackoverflow.com/questions/3575371
复制相似问题