Using GDB to read MSRs

后端 未结 3 594
花落未央
花落未央 2020-12-31 17:52

Is there some way to read the x86-64 model-specific registers, specifically IA32_FS_BASE and IA32_GS_BASE, while debugging a program using GDB?

Less preferable would

3条回答
  •  -上瘾入骨i
    2020-12-31 18:16

    The x86 MSRs can be read with the RDMSR instruction, which is privileged (Ring 0). In Linux there are system calls that a user thread can invoke to read FS_BASE and GS_BASE. There are no library wrappers for them, so you have to write code to invoke them yourself.

    Here's one way to do it in C++, you add these global function definitions to your program:

    #include 
    #include 
    #include 
    namespace x86 {
        uint64_t fs_base() {
            uint64_t fs_base;
            syscall(SYS_arch_prctl,ARCH_GET_FS,&fs_base);
            return fs_base;
        }
        uint64_t gs_base() {
            uint64_t gs_base;
            syscall(SYS_arch_prctl,ARCH_GET_GS,&gs_base);
            return gs_base;
        }
    }
    

    Now you can call these functions from gdb and print their return value in hex, like this:

    (gdb) p/x x86::fs_base()
    $1 = 0x7ffff5e01780
    (gdb) p/x x86::gs_base()
    $2 = 0x0
    (gdb)
    

提交回复
热议问题