我正在运行一个简单的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并运行“reboot”命令后,它会抛出分段错误。这是随机的,它可以是任何命令..
我可以为您提供您想要的信息。请帮我调试这个奇怪的问题...
答案 0 :(得分:0)
您的崩溃发生在free
内。
任何此类崩溃都是99.99%的标志,表明你有其他地方的 ,并且很可能与您已经显示的代码或pclose
完全无关
Valgrind,Address Sanitizer或GLIBC mcheck等工具是您最好的选择。