SIGSEGV:程序不按顺序执行

Posted

技术标签:

【中文标题】SIGSEGV:程序不按顺序执行【英文标题】:SIGSEGV: Program doesn't execute sequentially 【发布时间】:2014-09-14 17:23:03 【问题描述】:

我的程序收到一个 SIGSEGV,我正在尝试调试。奇怪的是,当我使用gdb逐行执行时,程序并没有按照我认为应该是正常的执行流程。

这是我的代码:

#include <iostream>
#include <fstream>

using namespace std;

char * str_reverse(char * s);

int main (int argv, char ** argc)
    char * strinput;

    fstream finput;
    fstream foutput;

    finput.open(argc[1], ios::in);
    finput >> strinput;
    finput.close();

    foutput.open(argc[2], ios::out);
    foutput << str_reverse(strinput);
    foutput.close();

    return 1;


char * str_reverse(char * s)
    int len = 0;
    while (s[len] != '\000') len++;
    char * rev = new char[len];
    for (int i = 0; i < len; i++)
        rev[i] = s[len-(i+1)];
    rev[len] = '\000';  
    return rev;

这是我在 gdb 中看到的:

18      foutput << str_reverse(strinput);
(gdb) n
19      foutput.close();
(gdb) n
21      return 1;
(gdb) n
11      fstream foutput;
(gdb) n
21      return 1;
(gdb) n

Program received signal SIGSEGV, Segmentation fault.

顺便说一句,程序做了它应该做的正确的事情:它打开一个文件,读取一个字符串并将其反向保存在另一个文件中。

【问题讨论】:

旁注:您切换了argcargvargc 应该是c数量的参数。 感谢您的评论 【参考方案1】:

程序没有遵循我认为应该是正常的执行流程。

我没有看到任何证据。据我所知,您的程序遵循正常的执行流程,然后main返回后崩溃。

发生这种情况是因为您有一个未初始化的指针strinput,并且您写入了该指针指向的不可预测位置。

碰巧在您的执行环境中,指针指向堆栈上的某个位置,因此您破坏了堆栈,这会导致您跳转到错误的地址,从而导致崩溃。

【讨论】:

哦,是的,也是。可能比我发现的错误还要严重。 非常感谢。当我使用 gdb 执行我的程序时,为什么它会经过第 21 -> 11 -> 21 行? 在第 21 行,就在返回之前,需要销毁本地对象 finputfoutput。我猜 GCC 将第 11 行“分配”给一个或两个析构函数(而且你的 GCC 可能相当老了)。 应该是这样。再次感谢!

以上是关于SIGSEGV:程序不按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

SIGSEGV 是不是交付给每个线程?

C++ - SIGSEGV 在向量<Mat> 上执行 push_back

Android Libgdx - 真实设备上的 Sigsegv 11 错误,但模拟器上没有崩溃

如何使用 SIGSEGV 的信号处理程序调试程序

UISearchBar、UITableViewController 和 UINavigationController,在执行本机代码时得到一个 SIGSEGV

应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1