分段在检索PID时在pclose处随机出错

时间:2017-05-07 03:10:33

标签: 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”命令后,它会抛出分段错误。这是随机的,它可以是任何命令..

我可以为您提供您想要的信息。请帮我调试这个奇怪的问题...

1 个答案:

答案 0 :(得分:0)

您的崩溃发生在free内。

任何此类崩溃都是99.99%的标志,表明你有其他地方的 ,并且很可能与您已经显示的代码或pclose完全无关

ValgrindAddress Sanitizer或GLIBC mcheck等工具是您最好的选择。