如何解决在unix上读取文件时出现退出代码139错误

问题描述 投票:0回答:5

所以我相信这只是 unix 上的一个问题,如果 Clion 调试器是正确的,它会在第一个 fscanf 时发生,但我不知道为什么会收到错误 - Process finish with exit code 139(被信号 11 中断: SIGSEGV)-为什么?

struct loginInformation
{
    char username[USERNAME_LENGTH];
    char password[PASSWORD_LENGTH];
    int type;
}accounts[NUM_OF_ACCOUNTS];

void createAccountsFromFile()
{
    FILE *input = fopen("accounts.txt", "r");
    int counter;
    for(counter = 0; counter < NUM_OF_ACCOUNTS; counter++)
    {
        fscanf(input, "%s", accounts[counter].username);
        fscanf(input, "%s", accounts[counter].password);
        fscanf(input, "%d", &accounts[counter].type);
    }
}

int main()
{
    createAccountsFromFile();
}

accounts.txt

user1
pass1
0
user2
pass2
1
user3
pass3
2
user4
pass4
3
c unix
5个回答
7
投票

这意味着程序在退出之前就崩溃了。你需要调试程序。例如,您需要在

fopen
之后检查文件是否成功打开。


3
投票

TL;DR:您的程序试图访问它无权访问的内存位置,因此操作系统杀死了它。


第一:代码“139”并不重要,忘记数字吧。您的程序在“收到 SIGSEGV”或有关分段违规的信号后终止。在这里阅读这意味着什么:

导致 SIGSEGV 的原因

(别介意这个问题是关于 C++ 的,同样的想法。)

现在,为什么会发生这种情况?你一定做出了一些不应该做的假设。查看您的代码,可能是:

  • 从文件中读取一个非常长的字符串,该字符串超出了
    loginInformation
    数组的边界 - 甚至可能超出了分配给整个程序的内存区域的边界。
  • 从无效状态/未初始化/空文件描述符扫描,如 @xuhdev 的 answer
  • (不太可能/不可能)忽略其中一个
    fscanf()
    调用生成的一些错误(如果扫描失败,您需要检查
    errno
    )。

我认为这涵盖了它,尽管也许我错过了一些东西。您可以使用调试器在 core dump:

上实际检查发生了什么,而不是猜测

当程序有命令行参数时,如何使用 GDB 分析程序的核心转储文件?


2
投票

SIGSEGV 并不总是由于内存访问问题的根本原因而抛出...

Perl 在 Unix 上抛出 139 通常是因为文件 I/O。您可能不小心删除了输入文件。


0
投票

检查下面链接的讨论bin/控制台错误139


-1
投票

关于我的“内存不足”导致的 Perl 编程 RC 139。 因为变量中的数据太多了(数百万)。 我通过定期释放(undef)这个变量来手动进行分段。 这解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.