c++ - 如何使用 GDB 获取有关异常的更多信息?
问题描述
我有一个多线程程序,其中一些线程导致异常。我在 gdb 中运行它,它在发生异常并且程序终止后给出以下输出:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
Thread 46 "MyProgram" received signal SIGABRT, Aborted.
[Switching to Thread 0x7fff3bfff700 (LWP 24491)]
0x00007ffff48f2428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) where
#0 0x00007ffff48f2428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007ffff48f402a in __GI_abort () at abort.c:89
#2 0x00007ffff514d0d5 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff514acc6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff514ad11 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff517719e in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff4c8e6ba in start_thread (arg=0x7fff3bfff700) at pthread_create.c:333
#7 0x00007ffff49c441d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
从输出where
并不能真正帮助找出导致问题的线程。
有没有办法从这种情况中获取更多信息?
解决方案
当您看到此输出时,要找出哪个线程抛出异常为时已晚,因为您的程序已经终止。我想您需要在异常上设置捕获点std::out_of_range
并继续运行您的程序,直到抛出此异常:
(gdb) catch throw out_of_range
当抛出异常时,gdb 应该停止并且您可以打印导致异常的线程的回溯。
推荐阅读
- angular-validation - Angular 自定义验证错误消息不起作用
- apache-spark - Kafka S3 Sink Connector - 如何将分区标记为完整
- javascript - 尝试使用 JavaScript 设置 datetime-local
- firebase - 如何在firestore的文本字段中开始一个新段落
- react-native - createMaterialTopTabNavigator 无法修改 tabStyle paddingVertical
- python-3.x - Python 3.9:使用标准库构造 DST 有效时间戳
- java - 如何将 DB AWS 机密传递到 tomcat context.xml?
- php - 通过动态表 PHP 中基于行的按钮访问行值
- python - 使用 PyODBC 和 SQL-Alchemy 同步数据更新
- r - 用 plotly 绘制线图时定义配色方案