Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Linux 为什么分割错误在gdb中不可再现?_Linux_Gdb_Googletest_Googlemock - Fatal编程技术网

Linux 为什么分割错误在gdb中不可再现?

Linux 为什么分割错误在gdb中不可再现?,linux,gdb,googletest,googlemock,Linux,Gdb,Googletest,Googlemock,我有一种情况,我运行了许多单元测试,其中一个触发了分段错误。该症状似乎与另一个测试用例有关,在失败的测试用例之前运行大约30个测试用例。显然,测试用例之间存在一些依赖关系,我可以通过注释掉前面的测试用例来轻松地打开和关闭分段错误。测试框架采用googletest/Mock 1.6.0。测试二进制文件完全用C++编写(GCC 4.63.)。它是单线程的(除非googletest创建线程) 然而,当我在gdb中运行所有测试用例时,并没有分段错误,这就是困扰我的地方 在终端中运行二进制文件时会出现分段

我有一种情况,我运行了许多单元测试,其中一个触发了分段错误。该症状似乎与另一个测试用例有关,在失败的测试用例之前运行大约30个测试用例。显然,测试用例之间存在一些依赖关系,我可以通过注释掉前面的测试用例来轻松地打开和关闭分段错误。测试框架采用googletest/Mock 1.6.0。测试二进制文件完全用C++编写(GCC 4.63.)。它是单线程的(除非googletest创建线程)

然而,当我在gdb中运行所有测试用例时,并没有分段错误,这就是困扰我的地方

在终端中运行二进制文件时会出现分段错误,但在通过gdb运行完全相同的二进制文件时不会出现分段错误的现实原因是什么?我想当gdb运行代码时,一切都会稍微慢一点,但我看不出这会如何影响结果

我这样做只是为了看不出错误:

gdb MyBinary
run
终端打印输出的最后几行:

[  PASSED  ] 368 tests.
[Inferior 1 (process 28349) exited normally]
Segmentation fault
这是为了找出故障:

MyBinary
终端打印输出的最后一行:

[  PASSED  ] 368 tests.
[Inferior 1 (process 28349) exited normally]
Segmentation fault
在终端中运行二进制文件时会出现分段错误,但在通过gdb运行完全相同的二进制文件时不会出现分段错误的现实原因是什么

最常见的两种是:

  • GDB禁用地址空间随机化。如果您正在读取某个未初始化的指针,并且该指针在GDB下总是恰好是
    NULL
    ,但在ASLR下可能不是
    NULL
  • 您有一个数据竞争,而GDB会减慢线程创建速度以隐藏该竞争(GDB必须做大量工作来跟踪所有线程)
  • 您可以使用
    将禁用随机化设置为off
    来防止GDB禁用ASLR

    您可能应该使用和检查您的测试

    在终端中运行二进制文件时会出现分段错误,但在通过gdb运行完全相同的二进制文件时不会出现分段错误的现实原因是什么

    最常见的两种是:

  • GDB禁用地址空间随机化。如果您正在读取某个未初始化的指针,并且该指针在GDB下总是恰好是
    NULL
    ,但在ASLR下可能不是
    NULL
  • 您有一个数据竞争,而GDB会减慢线程创建速度以隐藏该竞争(GDB必须做大量工作来跟踪所有线程)
  • 您可以使用
    将禁用随机化设置为off
    来防止GDB禁用ASLR


    您可能应该使用和检查您的测试。

    在找到错误之前,您可能不会有任何想法。只要你能以某种方式复制这个bug,你就不应该过于沉迷于它发生的环境,直到你有理由认为它们很重要。你可以试着在valgrind下运行单元测试,看看它能检测到哪些内存错误。顺便说一句,你可以将
    核心
    转储大小限制在合理的范围内(例如,至少500字节)在
    core
    上运行
    gdb
    post-mortem,在找到bug之前,你可能不会有任何想法。只要你能以某种方式复制bug,在你有理由认为它们很重要之前,你不应该太沉迷于它发生的环境。你可以试着在valgrind下运行单元测试,看看它的重要性它设法检测到了哪些内存错误。顺便说一句,您可以将
    core
    转储大小限制为合理的数字(例如,至少500字节),并在
    core
    上运行
    gdb
    post-mortem