【问题标题】:GDB printing library's warning origin call stackGDB 打印库的警告源调用堆栈
【发布时间】:2019-09-14 01:29:48
【问题描述】:

我收到了很多来自 OpenSceneGraph 的警告,看起来都像这样:

    Warning:: Picked up error in TriangleIntersect
   (-117448 -2.12751e+06 -519242,   -120167 -2.17679e+06 -383117,   -234607 -1.85755e+06 -431865)
   (-nan,   -nan,   -nan)

不幸的是,我无法追踪它们的来源。

我试图启动我的程序,然后用CTRL + C 中断它 并使用bt 打印回溯。它只给了我一些来自应用程序工作流的基本跟踪,例如:

#0  0x00007fffe8116bf9 in __GI___poll (fds=0x5555584549f0, nfds=3, timeout=461) at ../sysdeps/unix/sysv/linux/poll.c:29
#1  0x00007fffe45395c9 in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#2  0x00007fffe45396dc in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#3  0x00007ffff2a2897f in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#4  0x00007ffff29cd9fa in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#5  0x00007ffff29d6aa4 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5

输入时出现警告: void osgViewer::ViewerBase::frame()

我也尝试输入它,但它立即转义,打印警告并继续程序流程。我想它可能会在其他线程中触发一些操作。

我的问题来了,是否有机会使用 GDB 找到这些警告消息的来源/跟踪?

我正在使用 OpenSceneGraph 3.4

【问题讨论】:

  • 这应该很简单。搜索源代码以查找发出警告消息的位置,并在此处设置断点。
  • 但是它们是从动态链接的 OpenSceneGraph 发出的,所以我没有它的源代码,这就是为什么我正在寻找一种方法来获取警告的回溯以到达我的代码触发它的位置
  • 您可以尝试在 GDB 中捕获 SIGFPE 信号。请参阅相关问题stackoverflow.com/q/5393997/72178
  • 如果您没有源代码,您将无能为力。在 Linux 上,我只需加载包含所有源代码和调试符号的库的调试包。那么在gdb中设置断点就很简单了。没有源代码就无法调试代码。
  • 看起来 osg::notify 将是一个很好的断点位置

标签: c++ gdb openscenegraph


【解决方案1】:

错误来自这一行: https://github.com/jklimke/osg/blob/master/src/osgUtil/LineSegmentIntersector.cpp#L174

该代码和错误甚至不在当前的主干/头 OSG 源中,所以也许您的问题可以通过简单地更新到最新版本的 OSG 来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多