在SEGFAULT的情况下,了解GDB输出
Understand gdb output in case of segfault
我的程序中有一个segfault。我尝试使用gdb
的backtrace
命令来查找错误,但不幸的是,我不了解其输出:
(gdb) bt
#0 0x00007ffff1678480 in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#1 0x00007ffff171c11e in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#2 0x00007ffff17e565f in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#3 0x00007ffff17432e3 in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#4 0x00007ffff16580bf in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#5 0x00007ffff179e758 in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#6 0x00007ffff173cea8 in ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
#7 0x00007ffff6b8770a in start_thread (arg=0x7fffef352700) at pthread_create.c:333
#8 0x00007ffff68bd82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
有人知道Segfault的来源吗?例如,为什么main
方法未在backtrace
的输出中列出?
有人知道segfault来自何处吗?
是:gdb tell 您来自哪里: libnvidia-opencl.so.1
0x7ffff1678480
的未命名功能例如,为什么未在回溯输出中列出的主要方法?
因为崩溃发生在主线程以外的线程中。
那么,你该怎么办?
您几乎没有什么可以理解此崩溃的方法,因为您使用的是供应商提供的且完全不透明的库。
you 应该 遍历您程序所做的任何OpenCL
调用(假设它可以做到),并验证您提供的参数是否有效并满足OpenCL API要求。
您还应该做(gdb) thread apply all where
以查看其他线程在哪里。也许您的主线程未正确关闭OpenCl。
您还可以尝试使用不同的(可能较低的性能)开源OpenCL实现(例如POCL)运行程序。如果碰撞以pocl
复制,您将有更轻松的时间了解出了什么问题,因为您可以检查源出现问题。
从底部开始并开始工作:
#8 0x00007ffff68bd82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
我看到一个称为 clone
的函数。我本地键入man clone
并获得这样的东西。
第四段是
clone()的一种用途是实现线程: 在共享内存空间中同时运行的程序中的控制。
当我查看下一个堆栈帧
时,这似乎很重要0x00007ffff6b8770a in start_thread (arg=0x7fffef352700) at pthread_create.c:333
我在模块pthread_create
中看到一个称为start_thread
的函数。嗯,线程,线程,我以前在某个地方看到了这个词。我记得以前在某个地方看到pthread_create
,所以键入man pthread_create
...
好吧,这解释了为什么main
不在堆栈跟踪中 - 这是子线程的堆栈。不是main
运行的主线程。
请注意,您可以键入info threads
以查看发生故障时其他线程的运行,而thread 1
(或任何数字)可以切换到另一个线程并检查 it ITS stack。
- 正在尝试了解输入验证循环
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 了解 GLM- openGL 中的相机转换
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数
- 了解嵌套循环打印星号图案
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 使用vscode调试时,GDB意外退出
- 了解每月第一天函数的代码
- 了解C++标准::shared_ptr
- 尝试了解在导入的静态方法上使用删除方法时的错误
- C++:需要帮助了解运算符重载错误
- 在学习数据结构之前对STL有一个了解是好的吗?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 了解C++程序的 GDB 语法
- 在SEGFAULT的情况下,了解GDB输出
- 了解 gdb 输出
- 了解 GDB 中 STL 多集的红黑树遍历