關於64位CentOS上ptrace報 no such file 錯誤的解決方法
阿新 • • 發佈:2019-02-01
首先介紹一下ptrace:
ptrace提供了一種使父程序得以監視和控制其它程序的方式,它還能夠改變子程序中的暫存器和核心映像,因而可以實現斷點除錯和系統呼叫的跟蹤。
使用ptrace,你可以在使用者層攔截和修改系統呼叫(sys call)
我們以一個例項為例:
[cpp] view plain copy print?
執行gcc -o xxxx xxxx.c 之後報<linux/user.h> no such file...這個錯誤提示。
錯誤形成的原因是因為核心結構的變化使得原先/usr/include/linux/user.h消失而是變為了/usr/include/sys/reg.h
因此,除錯的時候需要將 #include linux/user.h> 這句變為 #include <sys/reg.h>
當然修改之後還是會報錯,原因是因為64位的暫存器結構和32位不同,解決方法是將ORIG_EAX改為ORIG_RAX便可以執行成功。
ptrace提供了一種使父程序得以監視和控制其它程序的方式,它還能夠改變子程序中的暫存器和核心映像,因而可以實現斷點除錯和系統呼叫的跟蹤。
使用ptrace,你可以在使用者層攔截和修改系統呼叫(sys call)
我們以一個例項為例:
[cpp] view plain copy print?
- #include <sys/ptrace.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <unistd.h>
-
#include <linux/user.h> /* For constants
- ORIG_EAX etc */
- int main()
- {
- pid_t child;
- long orig_eax;
- child = fork();
- if(child == 0) {
- ptrace(PTRACE_TRACEME, 0, NULL, NULL);
- execl("/bin/ls", "ls", NULL);
- }
- else {
- wait(NULL);
-
orig_eax = ptrace(PTRACE_PEEKUSER,
- child, 4 * ORIG_EAX,
- NULL);
- printf("The child made a "
- "system call %ld ", orig_eax);
- ptrace(PTRACE_CONT, child, NULL, NULL);
- }
- return 0;
- }
執行gcc -o xxxx xxxx.c 之後報<linux/user.h> no such file...這個錯誤提示。
錯誤形成的原因是因為核心結構的變化使得原先/usr/include/linux/user.h消失而是變為了/usr/include/sys/reg.h
因此,除錯的時候需要將 #include linux/user.h> 這句變為 #include <sys/reg.h>
當然修改之後還是會報錯,原因是因為64位的暫存器結構和32位不同,解決方法是將ORIG_EAX改為ORIG_RAX便可以執行成功。