如何在C ++中调试未捕获的异常核心转储

问题描述

我正在处理的应用程序在客户端计算机上崩溃,并且从核心转储中有以下调用堆栈:

#0  SignalKill () at /MyBuildDir/lib/c/kercalls/aarch64/SignalKill.S:8
#1  0x0000000001041d2c in abort () at /MyBuildDir/lib/c/ansi/abort.c:92
#2  0x000000007b1688d0 in __gnu_cxx::__verbose_terminate_handler () at ../../../../../libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x000000007b166400 in __cxxabiv1::__terminate (handler=) at ../../../../../libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x000000007b165238 in __cxa_call_terminate (ue_header=ue_header@entry=0x109dd5f0) at ../../../../../libstdc++-v3/libsupc++/eh_call.cc:54
#5  0x000000007b165d68 in __cxxabiv1::__gxx_personality_v0 (version=,actions=6,exception_class=,ue_header=0x109dd5f0,context=0x100c3bd0) at ../../../../../libstdc++-v3/libsupc++/eh_personality.cc:676
#6  0x00000000819f66f0 in _Unwind_RaiseException_Phase2 (exc=exc@entry=0x109dd5f0,context=context@entry=0x100c3bd0) at ../../../libgcc/unwind.inc:62
#7  0x00000000819f6f30 in _Unwind_Resume (exc=0x109dd5f0) at ../../../libgcc/unwind.inc:230
#8  0x000000008052cf04 in MyClass::MyFunction(unsigned int)
...

查看调用堆栈我认为这是由于未捕获的异常导致的,该异常导致生成std::terminate。不幸的是,我无法在开发机器上重现这种行为。

能否请您提供一些调试技术来帮助我确定抛出哪个异常? MyClass::MyFunction没有任何throw,但使用了几种std::类型。考虑到调用堆栈中的下一帧是throw,我是否可以假设MyClass::MyFunction已以某种方式插入_Unwind_Resume中?我可以在堆栈展开时排除throw(双throw)吗?

编辑1:

可执行文件是使用GCC 5.4.0编译的,运行时是libstdc ++。so.6.0.21

编辑2:第7帧上的值

(gdb) info locals
this_context = {reg = {0x100c3760,0x100c3768,0x100c3770,0x100c3778,0x0 <repeats 15 times>,0x100c3780,0x100c3788,0x100c3790,0x100c3798,0x100c37a0,0x100c37a8,0x100c37b0,0x100c37b8,0x100c37c0,0x100c37c8,0x100c3750,0x100c3758,0x0 <repeats 41 times>,0x100c37d0,0x100c37d8,0x100c37e0,0x100c37e8,0x100c37f0,0x100c37f8,0x100c3800,0x100c3808,0x0 <repeats 18 times>},cfa = 0x100c3f90,ra = 0x8052cf04 <MyClass::MyFunction(unsigned int)+860>,lsda = 0x0,bases = {tbase = 0x0,dbase = 0x0,func = 0x819f6eb8 <_Unwind_Resume>},flags = 4611686018427387904,version = 0,args_size = 0,by_value = '\000' <repeats 97 times>}
cur_context = {reg = {0x100c3760,0x100c3fa0,0x100c3fa8,0x100c3fb0,0x100c3fb8,0x100c3fc0,0x100c3fc8,0x100c3fd0,0x100c3fd8,0x100c3fe0,0x100c3fe8,0x100c3f90,0x100c3f98,cfa = 0x100c41b0,ra = 0x8011f384 <ClientClass::~ClientClass()+204>,lsda = 0x8229ebd2,func = 0x8011f2b8 <ClientClass::~ClientClass()>},by_value = '\000' <repeats 97 times>}
(gdb) p exc
$1 = (struct _Unwind_Exception *) 0x109dd5f0
(gdb) p *exc
Cannot access memory at address 0x109dd5f0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)