如何利用gdb调试程序之细节(info reg命令以及寄存器地址)

首先随便写一个test.c程序,一个简单的hello world即可。
编译:gcc -g test.c -o test (注意:-g这个参数一定带上,不然无法生成调试符号表)
加载:gdb test
(打印出Reading symbols from Desktop/test/test...done.类似的语句说明加载成功)
开始调试吧。
输入:info reg(发现提示The program has no registers now.)
这时候需要设置断点,让程序跑起来。不然肯定不能看到堆栈信息。
设置断点:b 行号(行号根据程序的大小来设)
运行:r
查看寄存器:info reg(这时候就可以看到如下栈的地址了)
还发现不对,显示着:
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
这时候并不是操作错误,而是你的电脑是64位机器,下面是在32位机器上得到的结果。
如何在linux下查看电脑是不是32位机器?
输入:file /sbin/init
/sbin/init: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared
libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x389ab74a8275f7e58c3ca189480162e3c9e5f8dd,
stripped(这就是64位)
如果敲完指令后有 ELF 32-bit LSB shared object,那么就是32位机器了。
由于硬件都是80x86微处理器架构的,所以需要查看arch\x86\include\asm\segment.h文件:
#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3)
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3)
自己可以仔细看看:在32 位机器上, GDT_ENTRY_DEFAULT_USER_DS为15,那么__USER_DS
为123,也就是16进制的0x7b;如果在64 位机器上, GDT_ENTRY_DEFAULT_USER_DS为5,所
以__USER_DS为43,也就是16进制的0x2b。其他段的值可以自己算一下。
其实GDT_ENTRY_DEFAULT_USER_DS对应的值GDT表中__USER_DS所属的位置,排在第15位。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值