我正在运行一个简单的 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”命令后,它会抛出段错误。同样,这是随机的,它可以是任何命令..
我可以为您提供尽可能多的信息。请帮助我调试这个奇怪的问题...
最佳答案
您的崩溃发生在 free
中。
任何此类崩溃都是 99.99% 的迹象表明您在其他地方存在堆损坏,并且很可能与您显示的代码或pclose
完全无关>.
Valgrind 等工具, Address Sanitizer , 或 GLIBC mcheck是您最好的选择。
关于c - 检索 PID 时 pclose 随机出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827442/