Linux 过程导致堆栈崩溃
我一直在写一个程序,试图用procps库找到自己。 但由于某种原因,它打破了堆栈。 这是我的代码:Linux 过程导致堆栈崩溃,linux,proc,procps,Linux,Proc,Procps,我一直在写一个程序,试图用procps库找到自己。 但由于某种原因,它打破了堆栈。 这是我的代码: int main(){ PROCTAB *ptp; proc_t task; pid_t mypid[1]; mypid[0] = getpid(); printf("My id: %d\n", mypid[0]); ptp = openproc(PROC_PID, mypid, 1); if(readproc(ptp, &task)
int main(){
PROCTAB *ptp;
proc_t task;
pid_t mypid[1];
mypid[0] = getpid();
printf("My id: %d\n", mypid[0]);
ptp = openproc(PROC_PID, mypid, 1);
if(readproc(ptp, &task)){
printf("Task id:%d\n",task.XXXID);
}
else{
printf("Error: could not find currect task\n");
}
closeproc(ptp);
printf("Done\n");
return 0;
}
运行程序时得到的输出为:
$ ./test
My id is: 8514
Task id is:8514
Done
*** stack smashing detected ***: ./test terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7688dd5]
/lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7688d8a]
./test[0x804863e]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75a24d3]
./test[0x80484f1]
======= Memory map: ========
...
Aborted (core dumped)
有人知道为什么会这样吗?
我做错什么了吗?
谢谢
编辑:
我查看了头文件,注意到我错误地使用了openproc函数。正确的使用方法是(对于pid)将mypid数组以null结尾,因此我将代码更改为:
int main(){
PROCTAB *ptp;
proc_t task;
pid_t mypid[2];
mypid[0] = getpid();
memset(&mypid[1], 0, sizeof(pid_t));
printf("My id: %d\n", mypid[0]);
ptp = openproc(PROC_PID, mypid);
if(readproc(ptp, &task)){
printf("Task id:%d\n",task.XXXID);
}
else{
printf("Error: could not find currect task\n");
}
closeproc(ptp);
printf("Done\n");
return 0;
}
它仍然会压碎堆栈。在这里它对我很有效。获得该版本的procps后,它编译并运行良好:
$ gcc -Wall -Werror -o rp -L. -lproc-3.2.8 rp.c
$ ./rp
My id: 11468
Task id:11468
Done
更新
请尝试修改后的版本:
proc_t *result;
...
if((result = readproc(ptp, NULL))){
printf("Task id:%d\n",result->XXXID);
free(result);
}
导致崩溃的一个可能原因是readproc()返回的proc_t struct包含其他动态分配的元素,例如环境变量或命令行参数。更安全的方法是让readproc()分配整个结构,然后使用freeproc()释放它:
openproc()来自哪个库?我在google上找到的那一个看起来有些不同。procps-3.2.8,它位于DIR/proc/readproc.h中。如果你查看头文件,我无法测试它,但是你能尝试一下
static pid\u t mypid[2]吗代码>而不是memset?奇怪。。不适合我。。。你在哪个系统上运行?这是一个Debian压缩2.6.18内核。这段代码中可能有一个bug,释放应该用freeproc()完成。
while ((proc_info = readproc(proc, nullptr)) != NULL) {
// do something with proc_info
freeproc(proc_info);
}