我有一种情况,我运行了一些单元测试,其中一个触发了分段错误.症状似乎与另一个测试案例有关,在失败的测试案例之前运行大约30个测试案例.显然,测试用例之间存在一些依赖关系,我可以通过注释掉早期的测试用例来轻松打开和关闭分段错误.Google Test/Mock 1.6.0用作测试框架.测试二进制文件完全用C++编写(gcc 4.6.3).它是单线程的(除非Google Test创建线程).
但是,当我在gdb中运行所有测试用例时,没有分段错误,这就是让我困惑的事情.
在终端中运行二进制文件时会出现分段错误的现实原因是什么,而不是在通过gdb运行完全相同的二进制文件时?我想当gdb运行代码时,一切都会稍慢,但我不知道这会对结果产生什么影响.
我这样做是为了看不出错:
gdb MyBinary run
最后一行终端打印输出:
[ PASSED ] 368 tests. [Inferior 1 (process 28349) exited normally]
这就看错了:
MyBinary
最后一行终端打印输出:
Segmentation fault
Employed Rus.. 5
在终端中运行二进制文件时会出现分段错误的现实原因是什么,而不是在通过gdb运行完全相同的二进制文件时?
最常见的两个是:
GDB禁用地址空间随机化.如果您正在读取一些未初始化的指针,并且该指针总是恰好NULL
位于GDB下,但可能不适用于NULL
ASLR.
你有一个数据竞争,并且GDB减慢了线程创建以隐藏该竞争(GDB必须做很多工作来跟踪所有线程).
您可以阻止GDB禁用ASLR set disable-randomization off
.
您应该使用MemorySanitizer和ThreadSanitizer检查您的测试.
在终端中运行二进制文件时会出现分段错误的现实原因是什么,而不是在通过gdb运行完全相同的二进制文件时?
最常见的两个是:
GDB禁用地址空间随机化.如果您正在读取一些未初始化的指针,并且该指针总是恰好NULL
位于GDB下,但可能不适用于NULL
ASLR.
你有一个数据竞争,并且GDB减慢了线程创建以隐藏该竞争(GDB必须做很多工作来跟踪所有线程).
您可以阻止GDB禁用ASLR set disable-randomization off
.
您应该使用MemorySanitizer和ThreadSanitizer检查您的测试.