【问题标题】:How to troubleshoot threading issues on Linux?如何解决 Linux 上的线程问题?
【发布时间】:2012-05-02 18:59:41
【问题描述】:

我正在尝试调试 Linux 上的应用程序问题。它倾向于在libstdc++.solibstdc.so 的随机位置与SIGSEGV 一起崩溃。

似乎在任何地方都没有明显的竞争条件,因为我添加的线程中的作业非常孤立。但它仍然几乎一直崩溃。

应用程序使用g++ -c ... -pthread -D_REENTRANT编译,并与g++ -pthread -o ...链接

但它仍然在libstdc*.so 函数之一中几乎一直崩溃。我已经浪费了几天时间试图找出问题所在,但还是不行......

有人有什么建议吗?有没有办法确保libstdc*.so 被编译为线程感知?任何可以帮助我的 gdb 命令?调试堆?

我只使用 Linux 几年,所以我迷路了......

【问题讨论】:

  • 能否贴出相关部分的代码?
  • 你想要芥末和那罐虫子吗?
  • @hmjd:不幸的是,它已经是一个庞大的代码库,它已针对多线程进行了扩展。我无法为其中的一部分创建复制场景。因此,我正在寻找可以提供帮助的技术,这就是我所能做的。
  • ... which is extended for multi-threading - 天哪!通常是一个糟糕的举动。最好将并发合并到技术设计中,尽管我承认你现在无法控制它。祝你好运!

标签: c++ linux debugging pthreads


【解决方案1】:

你应该做的事情很少:

编写单元测试。尽管它们在查找线程问题方面没有多大帮助,但它们可以极大地帮助您查找错误的内存访问问题。

【讨论】:

    【解决方案2】:

    如果您还没有编译,请尝试在编译时使用-g,以获取符号调试器信息。

    你得到一个核心转储了吗?如果是这样,您可以使用gdb 将内核加载到可执行文件中,如下所示:

    gdb <my-exe> <my-core-file>
    

    一旦加载(假设您使用-g 编译),您可以使用info threads 获取所有线程堆栈的列表并查看导致问题的线程。如果您跟踪导致从libstdc++.solibstdc.so 备份的段错误的堆栈跟踪,那么发生的事情应该很明显。至少它会带你到正确的区域。

    如果您没有内核,您可以在调试器本身内运行您的应用程序吗?

    这种技术对于深入了解线程死锁也非常有用:只需使用以下方法附加到进程:

    gdb <my-exe> <my-process-id>
    

    并寻找相互锁定的两个线程。

    【讨论】:

    • 我通过gdb myapp 启动应用程序,然后是rSIGSEGVbtinfo threads。我有调用堆栈,但它们在libstdc*.sos 内的mallocs 和news 上失败
    • 听起来像是您的运行时库安装搞砸了,或者您的构建环境和运行时环境不兼容。您是否从头开始重新构建所有内容并检查过LD_LIBRARY_PATH 或等效项?
    • 当然,但是哪些函数调用了mallocs 和news?查看调用堆栈,直到您看到与您的软件堆栈相关的函数,而不仅仅是在 clib 中。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2014-02-15
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多