C++ 如何解决Linux上的线程问题?

C++ 如何解决Linux上的线程问题?,c++,linux,debugging,pthreads,C++,Linux,Debugging,Pthreads,我正在尝试调试Linux上的应用程序的一个问题。它倾向于在libstdc++.so或libstdc.so的随机位置与SIGSEGV崩溃 似乎在任何地方都没有明显的竞争条件,因为我添加的线程中的工作是非常孤立的。但它几乎一直在崩溃 该应用程序是用g++-c-pthread-D_可重入,并链接到g++-pthread-o… 但它仍然几乎一直在一个libstdc*.so函数中崩溃。我已经浪费了几天时间试图找出问题出在哪里,但是没有办法 有人有什么建议吗?有没有办法确保libstdc*.so被编译为线程

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

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

该应用程序是用
g++-c-pthread-D_可重入
,并链接到
g++-pthread-o…

但它仍然几乎一直在一个
libstdc*.so
函数中崩溃。我已经浪费了几天时间试图找出问题出在哪里,但是没有办法

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


我只在Linux上工作了几年,所以我迷路了…

您应该做几件事:

  • 使用
  • 使用
  • 使用

编写单元测试。虽然它们对查找线程问题没有多大帮助,但它们可以帮助您查找错误的内存访问问题。

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

你有没有被丢弃的核心?如果是这样,您可以使用
gdb
根据可执行文件加载内核,如下所示:

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

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

你能发布代码的相关部分吗?你想用那罐蠕虫做一些芥末吗?@hmjd:不幸的是,它已经是一个很大的代码库,可以扩展为多线程。我无法为其中的一个子集创建复制场景。因此,我正在寻找能够有所帮助的技术,这就是我所能做的。。。它扩展为多线程-哦,天哪!一般来说,这是一个糟糕的举动。最好将并发性合并到技术设计中,尽管我承认您现在无法控制这一点。祝你好运我将通过
gdb myapp
,然后
r
SIGSEGV
bt
信息线程启动该应用程序。我有调用堆栈,但它们在
libstdc*中的
malloc
s和
new
s上失败。因此
sSounds可能是您的运行时库安装出错,也可能是您的构建环境和运行时环境不兼容。您是否从头开始重新构建了所有内容并检查了
LD\u LIBRARY\u PATH
或等效项?当然,但是调用
malloc
s和
new
s的函数是什么?查看调用堆栈,直到看到与软件堆栈相关的函数,而不仅仅是clib中的函数。
gdb <my-exe> <my-process-id>