procps导致堆栈粉碎

时间:2012-06-28 18:29:58

标签: 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)){
        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数组空终止,所以我改了我的代码到:

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;
}

它仍然会破坏堆栈。

2 个答案:

答案 0 :(得分:2)

这对我有用。获得该版本的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);
}

答案 1 :(得分:0)

崩溃的一个可能原因是readproc()返回的proc_t结构具有其他动态分配的元素,例如环境变量或命令行参数。更安全的方法是让readproc()分配整个结构,稍后使用freeproc()释放它:

while ((proc_info = readproc(proc, nullptr)) != NULL) {
    // do something with proc_info
    freeproc(proc_info);
}