当前位置:  开发笔记 > 编程语言 > 正文

为什么分段错误在gdb中不可重现?

如何解决《为什么分段错误在gdb中不可重现?》经验,为你挑选了1个好方法。

我有一种情况,我运行了一些单元测试,其中一个触发了分段错误.症状似乎与另一个测试案例有关,在失败的测试案例之前运行大约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下,但可能不适用于NULLASLR.

    你有一个数据竞争,并且GDB减慢了线程创建以隐藏该竞争(GDB必须做很多工作来跟踪所有线程).

您可以阻止GDB禁用ASLR set disable-randomization off.

您应该使用MemorySanitizer和ThreadSanitizer检查您的测试.



1> Employed Rus..:

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

最常见的两个是:

    GDB禁用地址空间随机化.如果您正在读取一些未初始化的指针,并且该指针总是恰好NULL位于GDB下,但可能不适用于NULLASLR.

    你有一个数据竞争,并且GDB减慢了线程创建以隐藏该竞争(GDB必须做很多工作来跟踪所有线程).

您可以阻止GDB禁用ASLR set disable-randomization off.

您应该使用MemorySanitizer和ThreadSanitizer检查您的测试.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有