zoukankan      html  css  js  c++  java
  • 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命令出现的目录清单

  • 相关阅读:
    爬虫
    PEP8 常用规范
    struts2入门Demo
    JDBC连接mysql数据库操作
    MongoDB学习笔记—03 增删改查操作
    MongoDB学习笔记—02 MongoDB入门
    MongoDB学习笔记-01 简介、安装
    ElasticSearch学习笔记-02集群相关操作_cat参数
    ElasticSearch学习笔记-01 简介、安装、配置与核心概念
    CSS学习
  • 原文地址:https://www.cnblogs.com/DWdan/p/5464600.html
Copyright © 2011-2022 走看看