2012-05-04 84 views
4

我想在運行時跟蹤的程序:用ptrace(PTRACE_ATTACH, ...)ptrace(PTRACE_SINGLESTEP, ...)等。ptrace_detach,SIGINT和跟蹤/斷點陷阱(核心轉儲)

一切似乎都很正常,但是當我退出我的跟蹤程序爲CTRL-C,我想從跟蹤的程序中分離它(當與PTRACE_DETACH),並且當我執行此操作時,跟蹤的程序崩潰,並顯示錯誤Trace/BPT trap (core dumped)

我的問題是:如何正確分離而不使被跟蹤的程序崩潰?

這裏是捕捉SIGINT信號的功能:

void sig_int() 
{ 
    if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) 
     my_perror("ptrace/DETACH", strerror(errno)); 
} 

編輯:

下面是一些其他代碼:

if ((ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL) == -1))                         
    my_perror("ptrace/SINGLESTEP", strerror(errno)); 
if (wait4(pid, &(l->status), 0, 0) == -1) 
    my_perror("wait4", strerror(errno)); 
if (ptrace(PTRACE_GETREGS, pid, 0, &(l->reg)) == -1) 
    my_perror("ptrace/GETREGS", strerror(errno)); 
if ((l->opcode = ptrace(PTRACE_PEEKTEXT, pid, l->reg.rip, NULL)) == -1) 
    my_perror("ptrace/PEEKTEXT", strerror(errno)); 

這是我的循環,其中的一部分我做我的追蹤的第一部分

+0

我一直在搜索錯誤的起源,並試圖在分離之前和之後等待被追蹤的程序,但仍然發生相同的錯誤,或者在兩個程序之間存在一個inifite循環。 – Mindhavok

回答

2

OK m y問題已經解決,這裏是捕捉SIGINT的新功能:

void   int_sig() 
{ 
    if (stop == 0) 
    { 
     printf("Interrupting!\n"); 
     ptrace(PTRACE_CONT, pid, NULL, NULL); 
     exit(0); 
    } 
} 

這個新變量名爲'stop'是什麼?

那麼讓我們回到我的代碼當我singlesteppin',並知道我的下一個singlestep是系統調用後連續getregs第二次。我就是這麼做的,爲了得到系統調用的返回值:

void   do_step(t_list *l)                               
{ 
    if ((ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL) == -1)) 
    my_perror("ptrace/SINGLESTEP", strerror(errno)); 
    if (wait4(pid, &(l->status), 0, 0) == -1) 
    my_perror("wait4", strerror(errno)); 
if (ptrace(PTRACE_GETREGS, pid, 0, &(l->reg)) == -1) 
    my_perror("ptrace/GETREGS", strerror(errno)); 
if ((l->opcode = ptrace(PTRACE_PEEKTEXT, pid, l->reg.rip, NULL)) == -1) 
    my_perror("ptrace/PEEKTEXT", strerror(errno)); 
} 

void   do_next_step(t_list *l, t_strace *t) 
{ 
    stop = 1; 
    if (ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL) == -1 || 
     (wait4(pid, &(l->status), 0, 0) == -1)) 
    my_perror("ERROR", strerror(errno)); 
    if (!WIFSTOPPED(l->status) || WIFEXITED(l->status)) 
    { 
     printf("?\n"); 
     exit(0); 
    } 
if (ptrace(PTRACE_GETREGS, pid, 0, &(l->reg)) == -1) 
    my_perror("ptrace/GETREGS", strerror(errno)); 
if (t->ret == 1) 
    printf("%d\n", (int)l->reg.rax); 
    else 
    printf("%#lx\n", l->reg.rax); 
    stop = 0; 
} 

我發現,如果我試圖打斷我的跟蹤計劃,而我是在do_next_step職能A anaylse,這將崩潰的追蹤程序!

因此,如果我在'do_next_step'函數中,我把一個標誌跳過int_sig()中的動作!

希望未來會有幫助和/或有趣!

非常感謝那些幫助我解決這個問題的人! 乾杯!

+0

爲了找到一個解決方案你自己:) –