gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:39 25 4
gpt4 key购买 nike

我有这样一种情况,我运行了一些单元测试,其中一个触发了段错误。该症状似乎与另一个测试用例有关,该测试用例在失败的测试用例之前运行了大约 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

最佳答案

What are realistic reasons why there would be a segmentation fault when running a binary in a terminal, but not when running the very same binary through gdb?

最常见的两个是:

  1. GDB 禁用地址空间随机化。如果您正在读取一些未初始化的指针,并且该指针在 GDB 下总是恰好为 NULL,但在 ASLR 中可能不是 NULL
  2. 您有数据竞争,GDB 减慢线程创建速度以隐藏该竞争(GDB 必须做很多工作来跟踪所有线程)。

您可以使用 set disable-randomization off 来阻止 GDB 禁用 ASLR。

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

关于linux - 为什么段错误在 gdb 中不可重现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34177429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com