2014-02-11 4 views
5

Ich versuche, den Stapel eines laufenden proccess auf Linux Fedora 20 (Ich möchte tun, es selbst ohne GDB/...)C-Programm dump Stapel laufenden Prozess auf Linux

aber es dump sieht aus wie der Standardwert meines Puffers (buf) wird nie ersetzt, auch wenn die read() der/proc/x/mem mir positive Zahl zurückgeben.

I deaktiviert selinux

[[email protected] ~]$ cat /proc/2419/maps 
00400000-00401000 r-xp 00000000 fd:02 164622        /home/me/memo 
00600000-00601000 r--p 00000000 fd:02 164622        /home/me/memo 
00601000-00602000 rw-p 00001000 fd:02 164622        /home/me/memo 
7fd7cbea2000-7fd7cc056000 r-xp 00000000 fd:02 8636      /usr/lib64/libc-2.18.so 
7fd7cc056000-7fd7cc256000 ---p 001b4000 fd:02 8636      /usr/lib64/libc-2.18.so 
7fd7cc256000-7fd7cc25a000 r--p 001b4000 fd:02 8636      /usr/lib64/libc-2.18.so 
7fd7cc25a000-7fd7cc25c000 rw-p 001b8000 fd:02 8636      /usr/lib64/libc-2.18.so 
7fd7cc25c000-7fd7cc261000 rw-p 00000000 00:00 0 
7fd7cc261000-7fd7cc281000 r-xp 00000000 fd:02 723      /usr/lib64/ld-2.18.so 
7fd7cc469000-7fd7cc46c000 rw-p 00000000 00:00 0 
7fd7cc47d000-7fd7cc480000 rw-p 00000000 00:00 0 
7fd7cc480000-7fd7cc481000 r--p 0001f000 fd:02 723      /usr/lib64/ld-2.18.so 
7fd7cc481000-7fd7cc482000 rw-p 00020000 fd:02 723      /usr/lib64/ld-2.18.so 
7fd7cc482000-7fd7cc483000 rw-p 00000000 00:00 0 
7fffc8479000-7fffc849a000 rw-p 00000000 00:00 0       [stack] 
7fffc854e000-7fffc8550000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 


[[email protected] ~]$ cat analyse.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/ptrace.h> 
#include <fcntl.h> 

#define STACK_BEGIN 0x7fffc8479000 
#define STACK_END 0x7fffc849a000 
#define STACK_SIZE STACK_END - STACK_BEGIN 

void main(int argc, char** argv) 
{ 
    int pid = atoi(argv[1]); 
    char mem_file_name[30]; 

    int mem_fd; 
    char buf[STACK_SIZE]; 

    sprintf(mem_file_name, "/proc/%d/mem", pid); 
    mem_fd = open(mem_file_name, O_RDONLY); 
    printf("PID=%d\n\ 
      NAME=%s\n\ 
      FD=%d\n\ 
      Initial value of buf : %x\n", pid, mem_file_name, mem_fd, buf); 

    int ptrace_log = ptrace(PTRACE_ATTACH, pid, NULL, NULL); 

    waitpid(pid, NULL, 0); 
    int lseek_log = lseek(mem_fd, STACK_BEGIN, SEEK_SET); 
    int rd = read(mem_fd, buf, STACK_SIZE); 

    printf("in Memory at : %zd, %x (readed %d chari - ptrace ret = %d - lseek ret = %d)\n", STACK_BEGIN, buf, rd, ptrace_log, lseek_log); 

    ptrace(PTRACE_DETACH, pid, NULL, NULL); 
    close(mem_fd); 
} 

[[email protected] ~]$sudo ./analyse 2419 
PID=2419 
NAME=/proc/2419/mem 
FD=3 
Initial value of buf : da5030f0 
in Memory at : 140736553521152, da5030f0 (readed 135168 chari - ptrace ret = 0 - lseek ret = -934834176) 
+0

Sie drucken die Adresse von 'buf', nicht den Inhalt. – Barmar

+1

Drucken Sie stattdessen '* buf' oder' buf [0] ', und Sie sollten einen Unterschied sehen. – Barmar

+0

Ich bekam immer noch Probleme (wegen 0 in Buf), also habe ich geschrieben (STDOUT_FILENO, Fehler, STACK_SIZE); Ich arbeite jetzt, danke :) – IggY

Antwort

0

read() nicht die Adresse von buf ändern (wie könnte es?), Ändert sich der Inhalt. Wenn Sie die Änderung sehen möchten, müssen Sie den Inhalt ausdrucken. Drucken *buf zeigt das erste Zeichen des Puffers.

void main(int argc, char** argv) 
{ 
    int pid = atoi(argv[1]); 
    char mem_file_name[30]; 

    int mem_fd; 
    char buf[STACK_SIZE]; 

    sprintf(mem_file_name, "/proc/%d/mem", pid); 
    mem_fd = open(mem_file_name, O_RDONLY); 
    printf("PID=%d\n\ 
      NAME=%s\n\ 
      FD=%d\n\ 
      Initial value of buf : %c\n", pid, mem_file_name, mem_fd, *buf); 

    int ptrace_log = ptrace(PTRACE_ATTACH, pid, NULL, NULL); 

    waitpid(pid, NULL, 0); 
    int lseek_log = lseek(mem_fd, STACK_BEGIN, SEEK_SET); 
    int rd = read(mem_fd, buf, STACK_SIZE); 

    printf("in Memory at : %zd, %c (readed %d chari - ptrace ret = %d - lseek ret = %d)\n", STACK_BEGIN, *buf, rd, ptrace_log, lseek_log); 

    ptrace(PTRACE_DETACH, pid, NULL, NULL); 
    close(mem_fd); 
} 
Verwandte Themen