2012-06-28 7 views
-1

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 배열을 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; 
} 

그리고 아직도 스택을 분쇄합니다.

+0

어떤 lib가 openproc()입니까? 내가 Google에서 찾은 하나는 다소 다르게 보입니다. –

+0

procps-3.2.8, 그것은 헤더 파일을보고있는 경우 DIR/proc/readproc.h에 있습니다. – user1011071

+0

테스트 할 수는 없지만, 정적 pid_t mypid [2]; 대신 memset? –

답변

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); 
} 
+0

이상한 .. 나를 위해 작동하지 않습니다 ... 어떤 시스템을 실행하고 있습니까? – user1011071

+0

이것은 2.6.18 커널을 사용하는 데비안 압축입니다. –

+0

@ user1011071 답변을 업데이트했습니다. –

0

을 readproc()에 의해 반환 된 proc_t 구조체는 환경 변수 나 명령 줄 인수와 같이 동적으로 할당 된 추가 요소를 가지고 있습니다. 더 안전한 방법은 readproc()이 전체 구조체를 할당하도록하고 freeproc()을 사용하여 나중에 해제하는 것입니다.