Linux 为什么分割错误在gdb中不可再现?
我有一种情况,我运行了许多单元测试,其中一个触发了分段错误。该症状似乎与另一个测试用例有关,在失败的测试用例之前运行大约30个测试用例。显然,测试用例之间存在一些依赖关系,我可以通过注释掉前面的测试用例来轻松地打开和关闭分段错误。测试框架采用googletest/Mock 1.6.0。测试二进制文件完全用C++编写(GCC 4.63.)。它是单线程的(除非googletest创建线程) 然而,当我在gdb中运行所有测试用例时,并没有分段错误,这就是困扰我的地方 在终端中运行二进制文件时会出现分段错误,但在通过gdb运行完全相同的二进制文件时不会出现分段错误的现实原因是什么?我想当gdb运行代码时,一切都会稍微慢一点,但我看不出这会如何影响结果 我这样做只是为了看不出错误:Linux 为什么分割错误在gdb中不可再现?,linux,gdb,googletest,googlemock,Linux,Gdb,Googletest,Googlemock,我有一种情况,我运行了许多单元测试,其中一个触发了分段错误。该症状似乎与另一个测试用例有关,在失败的测试用例之前运行大约30个测试用例。显然,测试用例之间存在一些依赖关系,我可以通过注释掉前面的测试用例来轻松地打开和关闭分段错误。测试框架采用googletest/Mock 1.6.0。测试二进制文件完全用C++编写(GCC 4.63.)。它是单线程的(除非googletest创建线程) 然而,当我在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运行完全相同的二进制文件时不会出现分段错误的现实原因是什么
最常见的两种是:
NULL
,但在ASLR下可能不是NULL
将禁用随机化设置为off
来防止GDB禁用ASLR
您可能应该使用和检查您的测试
在终端中运行二进制文件时会出现分段错误,但在通过gdb运行完全相同的二进制文件时不会出现分段错误的现实原因是什么
最常见的两种是:
NULL
,但在ASLR下可能不是NULL
将禁用随机化设置为off
来防止GDB禁用ASLR
您可能应该使用和检查您的测试。在找到错误之前,您可能不会有任何想法。只要你能以某种方式复制这个bug,你就不应该过于沉迷于它发生的环境,直到你有理由认为它们很重要。你可以试着在valgrind下运行单元测试,看看它能检测到哪些内存错误。顺便说一句,你可以将
核心转储大小限制在合理的范围内(例如,至少500字节)在core
上运行gdb
post-mortem,在找到bug之前,你可能不会有任何想法。只要你能以某种方式复制bug,在你有理由认为它们很重要之前,你不应该太沉迷于它发生的环境。你可以试着在valgrind下运行单元测试,看看它的重要性它设法检测到了哪些内存错误。顺便说一句,您可以将core
转储大小限制为合理的数字(例如,至少500字节),并在core
上运行gdb
post-mortem