c - 检索 PID 时 pclose 随机出现段错误

标签 c linux segmentation-fault arm gdb

我正在运行一个简单的 C 应用程序,它将持续获取进程的 PID。 这是在自定义 ARM 板上运行的。

pid_t GetStreamerPID()
{
    pid_t pid = 0;
    int ret = 0;
    char line[100];
    char command[50] = "pidof -s gst-launch-0.10"; 
    memset(line, '\0', 100);
    FILE *cmd = popen(command, "r");

    if ( cmd == NULL )
    {
    perror("Popen\n");
    exit(0);
    }    
    ret = fread(line, sizeof(char), 20, cmd);
    pclose(cmd);    
    pid = atoi(line);
    return pid;
}

随机地,代码在 pclose 处抛出段错误。我从上周开始调试这个问题,我无法找出问题的原因。

附加 gdb 回溯:

Program received signal SIGSEGV, Segmentation fault.
0x76e3a588 in free () from /lib/libc.so.6
(gdb) bt full
#0  0x76e3a588 in free () from /lib/libc.so.6
No symbol table info available.
#1  0x76e25c20 in fclose@@GLIBC_2.4 () from /lib/libc.so.6
No symbol table info available.
#2  0x000109b4 in GetStreamerPID () at getPid.c:111
        pid = 0
        ret = 0
        line = '\000' <repeats 99 times>
        command = "pidof -s gst-launch-0.10", '\000' <repeats 25 times>
        cmd = 0x136c008
#3  0x00010a50 in startStreamer () at getPid.c:147
        command = '\000' <repeats 255 times>
        pid = 0
#4  0x0001087c in CheckVideoState () at getPid.c:81
        iVideoOn = 1
#5  0x00010a20 in MainLoop () at getPid.c:137
No locals.
#6  0x00010b74 in main () at getPid.c:183
No locals.

另外,还有一个奇怪的观察结果是,在我关闭 gdb 并运行“rebo​​ot”命令后,它会抛出段错误。同样,这是随机的,它可以是任何命令..

我可以为您提供尽可能多的信息。请帮助我调试这个奇怪的问题...

最佳答案

您的崩溃发生在 free 中。

任何此类崩溃都是 99.99% 的迹象表明您在其他地方存在堆损坏,并且很可能与您显示的代码或pclose 完全无关>.

Valgrind 等工具, Address Sanitizer , 或 GLIBC mcheck是您最好的选择。

关于c - 检索 PID 时 pclose 随机出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827442/

相关文章:

c++ - 将分配的 C++ 数组传递给 Fortran 子例程

python ,Skype4py

c - 来自结构数组的函数调用

c++ - 使用#ifdef 是正确的策略吗

linux - 平均负载会影响性能吗?

在静态变量初始化中使用 cout 时出现 C++ 段错误

c - 在 C 中,什么是 "%n"?这段代码是如何工作的?

c - 为什么我会收到此 "passing argument to parameter"错误

在 ubuntu 20.04.3 上从 gdb 运行 helloworld.c 的 CRC 不匹配警告

linux - bash:检查目录中的多个文件是否包含列表中的字符串