• linux 使用ptrace函数时找不到头文件 .h 或者找不到某个宏的解决方法


    例如:

    #include <stdio.h>
    #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;
    }

    在linux的某些版本是运行不了,报错:找不到某个头文件或者某个宏。(上面的代码是基于i386,我试过了好几个linux的版本,还是运行出问题)

    最后发现问题了。解决如下:

    linux如何查找一个宏或者函数定义的位置:

    以宏定义ORIG_EAX为例:

    在终端输入

    第一种方法:

    find /usr/include/ -name *.h | xargs grep 'ORIG_EAX'

    结果:

    /usr/include/i386-linux-gnu/asm/ptrace-abi.h:#define ORIG_EAX 11
    
    /usr/include/i386-linux-gnu/sys/reg.h:# define ORIG_EAX 11

    第二种方法:

    grep -nr ORIG_EAX /usr/include/

    这种方法可以知道在第几行定义宏

    结果:

    /usr/include/i386-linux-gnu/asm/ptrace-abi.h:17:#define ORIG_EAX 11
    
    /usr/include/i386-linux-gnu/sys/reg.h:69:# define ORIG_EAX 11

    最后修改后,成功运行:
    #include <stdio.h>
    #include <sys/ptrace.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/reg.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;
    }

    运行结果:

    The child made a system call 11

    后面还有ls命令出现的目录清单

  • 相关阅读:
    串行通讯FIFO法和中断处理程序中直接处理的比较
    [FSM]状态机入门——程咬金只要三斧头厉害
    [FSM]状态机平面(任务平面)
    KMP算法
    【对线面试官】 Java 泛型
    【对线面试官】Java注解
    古文明中的经典作品
    《我是猫》总结
    Vue快速使用
    《算法帝国》总结
  • 原文地址:https://www.cnblogs.com/DWdan/p/5464600.html
Copyright © 2020-2023  润新知