Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在多核上运行时出现分段故障 我使用的是C++库,它是多线程的,工作线程的数量可以使用变量来设置。该库使用pthreads。当我在使用3个或更多线程的四核机器上运行作为库测试提供的应用程序时,问题就会出现。应用程序退出时出现分段错误运行时错误。当我尝试在库的某些部分插入一些跟踪“cout”时,问题得到解决,应用程序正常完成。 在单核机器上运行时,无论使用多少线程,应用程序都会正常完成_C++_Multithreading_Segmentation Fault_Multicore - Fatal编程技术网

仅在多核上运行时出现分段故障 我使用的是C++库,它是多线程的,工作线程的数量可以使用变量来设置。该库使用pthreads。当我在使用3个或更多线程的四核机器上运行作为库测试提供的应用程序时,问题就会出现。应用程序退出时出现分段错误运行时错误。当我尝试在库的某些部分插入一些跟踪“cout”时,问题得到解决,应用程序正常完成。 在单核机器上运行时,无论使用多少线程,应用程序都会正常完成

仅在多核上运行时出现分段故障 我使用的是C++库,它是多线程的,工作线程的数量可以使用变量来设置。该库使用pthreads。当我在使用3个或更多线程的四核机器上运行作为库测试提供的应用程序时,问题就会出现。应用程序退出时出现分段错误运行时错误。当我尝试在库的某些部分插入一些跟踪“cout”时,问题得到解决,应用程序正常完成。 在单核机器上运行时,无论使用多少线程,应用程序都会正常完成,c++,multithreading,segmentation-fault,multicore,C++,Multithreading,Segmentation Fault,Multicore,我怎样才能找出问题出在哪里 这是一种同步错误吗?我怎样才能找到它?有什么工具我也可以使用吗?检查代码?一些常规调试建议 确保构建有符号(使用-g编译)。此选项与其他构建选项正交(即,使用符号构建的决策与优化级别无关) 有了符号后,仔细查看seg故障发生的调用堆栈。为此,首先确保您的环境配置为生成核心文件(ulimit-c unlimited),然后在崩溃后,在调试器中加载程序/核心(gdb/path/To/prog/path/To/core)。一旦您知道代码的哪一部分导致了崩溃,您就可以更好地了

我怎样才能找出问题出在哪里


这是一种同步错误吗?我怎样才能找到它?有什么工具我也可以使用吗?检查代码?

一些常规调试建议

  • 确保构建有符号(使用-g编译)。此选项与其他构建选项正交(即,使用符号构建的决策与优化级别无关)
  • 有了符号后,仔细查看seg故障发生的调用堆栈。为此,首先确保您的环境配置为生成核心文件(ulimit-c unlimited),然后在崩溃后,在调试器中加载程序/核心(gdb/path/To/prog/path/To/core)。一旦您知道代码的哪一部分导致了崩溃,您就可以更好地了解出了什么问题

  • 听起来你在使用Linux(你提到了pthreads)。你考虑过跑步吗


    Valgrind有用于检查数据竞争条件(helgrind)和内存问题(memcheck)的工具。Valgrind可能会在调试模式下发现这样的错误,而不需要产生发布模式所产生的崩溃。

    您正处于竞争状态。
    多个线程在同一资源上交互。
    有一大堆可能的罪犯,但没有消息来源,我们所说的一切都是猜测

    您想要创建一个核心文件;然后用核心文件调试应用程序。这会将调试器设置为应用程序崩溃时的状态。这将允许您检查变量/寄存器等

    如何做到这一点将非常取决于您的系统

    一个快速的谷歌揭示了这一点:


    希望这有帮助。

    根据您的描述,这似乎是一种竞速状态,其中一个线程很可能正在尝试访问尚未由另一个线程初始化的内存。您可能想尝试在调试器下重新编程,并查看失败点处的调用堆栈。我真的不知道失败点在哪里,因为在调试模式下,问题不会出现。调试模式下的某些编译器会根据其默认值初始化变量,因此在调试模式下可能不会发生这种情况。优化时,您可以包括调试符号,并且可以附加调试程序,而不管这些符号是什么。“调试模式”用词不当。当您遇到SEGFAULT时,您可以让系统转储程序的核心,然后由调试器加载。不同的系统使用不同的方法来表示需要核心文件。但通常情况下,这就像设置环境变量一样简单。查看您的系统文档了解详细信息。我不知道什么是核心。我不知道/路径/到/核心。你能详细解释一下吗?好吧,你很快就会发现“gdb”了:)我用过helgrind。它建议在代码的串行部分中运行的部分中出现一些错误作为竞态条件,它还指示在如下所示的并行部分中出现一些相同的错误,但我不明白这意味着什么。--------------------------------------==28556==这与线程先前读取的大小为4的数据冲突#6==28556==在0x806A3ED:Population::GaSortedGroup::GetAt(int)const(SortedGroup.h:181)…(方法调用顺序)争用条件是,有两个或多个线程同时(可能)查看相同的数据位。通常共享的可变数据应该受到互斥锁的保护,这样,当另一个线程更新数据时,就不能(例如)让一个线程读取数据。这会给您带来陈旧的数据并导致问题。