微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?