【问题标题】:Segmentation fault disappears when debugging with GDB使用 GDB 调试时分段错误消失
【发布时间】:2013-12-28 01:39:07
【问题描述】:

我在运行 code: http://ideone.com/yU80Bd 时遇到分段错误

问题是当我在 GDB 中运行它时,代码运行良好且出色。为什么它在 gdb 中运行而没有段错误,但在其他地方运行却出现段错误?

这是我要解决的问题:http://www.codechef.com/DEC13/problems/CHODE

【问题讨论】:

  • 您可能想查看可能的竞争条件
  • 什么是竞态条件?
  • @Unbound:你可以用谷歌搜索的术语。
  • 你能缩小代码范围吗?在此处内联发布较短的测试用例?
  • @PaulEvans OP 链接到的代码是单线程的。为什么会有比赛?

标签: c++ gdb segmentation-fault


【解决方案1】:

问题是您的输入包含不在[a-Z] 范围内的字符。例如:! 这会导致在无效索引处访问向量。

您可以使用valgrind 检查运行程序的这些内容。

valgrind ./ideone < stdin
...
==2830== Invalid read of size 4
==2830==    at 0x40111A: main (ideone.cpp:53)
...
==2830== Invalid write of size 4
==2830==    at 0x401120: main (ideone.cpp:53)

问题出在以下几行:

    for(int i=0;i<cipherText.size();++i)
    {
        char c = tolower(cipherText[i]);
        ++(cipherF[c-97].frequency);
    }

c - 97 可能小于 0。

您可以检查,例如:

    for(int i=0;i<cipherText.size();++i)
    {
        char c = tolower(cipherText[i]);
        if (c < 'a' || c > 'z') continue;
        ++(cipherF[c-97].frequency);
    }

【讨论】:

  • 好吧,我找到了问题,但是GDB有什么问题呢?由于 valgrind 发现了问题,所以应该有 GDB,对吧?
  • 为了便于调试,GDB 对环境进行了一些更改。 Valgrind 正在寻找无效的内存访问,gdb is0t。如果在 gdb 中启用 ASLR,则会出现段错误。在调试您的程序之前尝试在gdb 上运行set disable-randomization off
  • 请记住,valgrind 和 gdb 一起使用:P。你甚至可以在 valgrind 检测到段错误后启动 gdb!
猜你喜欢
  • 2015-09-15
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2020-01-29
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多