linux下gdb调试进阶

dmesg |more,可以看内核的打印。

gdb ./gemalloc

b brk

r

bt

info shared 显示当前进程所有的动态so,第一个是ld-linux-x86-64.so (loader)

libc.so,

gdb --pid 3319

info threads, 每个线程都是一个LWP

thread apply all bt

!ps -A
!cat /proc/3139/maps, 进程地址空间,48位的地址表示方法。

直接回车,就是执行上一条命令。

help bt

cond 2 $_thread != 57

thread 1
bt
frame 4
list

info args 显示参数的入参
p argv[0]

cd labs下研究的内核程序,可以重编后,替换。

/home/glibc 用户态需要研究的程序,用于和内核之间交互。

cd /labs/hdtrap

./hdtrap, 产生coredump

dmesg,进程访问的地址名,看是否非法访问

gdb ./hdtrap

b main

info b

r
bt

info reg 看物理寄存器上的信息,上下文,cpu层面的。指令。

64位内核上,可以跑32位程序。

x /16x $esp , 观察寄存器某个伪变量所在的一段内存地址

info shared 显示当前进程中已加载的动态库

!ps -A,在gdb里面加上感叹号,就是执行操作系统命令。

!cat /proc/4137/maps,查看某个进程的地址表。

info symbol 0xf7e1f637,查看某个地址所处的符号,main函数是被libc_start_main调用。

bt
info agrs 入参
info locals局部变量
where 查看当前的位置
l显示源代码

!readelf --debug-dump hdtrap

set disassembly-flavor intel

disassemble 对get_file_id进行反汇编。

栈的空间比较大,没有个数限制,运行慢。处于内存上,不容易变。

寄存器的空间小,运行快,即时性高。

pt func,打印函数声明,数据结构类型

!ls

.c是单独编译的

函数如果没有显示声明,那么就会按照隐士声明,按照传递的参数大小,进行传参。

比如传3个整数,char ,ulongulong,int, 由于中间一个是8个字节,但默认是3个整数参。所以最后一个int*会被穿成ulongulong的高位。

cat /proc/sys/kernel/core+pattern

| /usr/share/appsupport %p %s

ulimit -c 不能为0,用户资源限制。可以设置为unlimited

gdb ./aaa -c corefile, 必须要有可执行文件信息。
也可以打开后,再指定主程序,file ./aaa
dir /mnt/c/temp 设置源代码目录

readelf -h coredemo

/var/log系统目录下,会有很多的内核日志。

info registers查看寄存器信息,指针值一般不可能为奇数地址,一般为4字节整除。

symbol-file可以导入符号文件。

info source显示源文件

watch fd,监视变量的值,硬件断点

info signals

set follow-fork-mode child

软件申请的内存 -> 虚拟线性地址表 -> 物理页表 (page dir -> page table -> entry)

top,然后F选显示列,空格选择。 vmj, major or minor default

cat /proc/3444/status

虚拟表 到 物理页表的缓存,tlb,translation lookaside buffer、把进程绑定在cpu上,可以减少页表切换的次数。

gdb -p gedit_pid

p main_arena 用gcc编译的libc程序。主场地是堆区,非主场地是mmap,主要是解决多线程的。

ptype *av

p *av

gdb ./gemalloc
b malloc
r
bt

info shared
c

commands 1 对1号断点
->print “%d”, n
->bt
->c
->end

b main
info func malloc

b __GI__libc_malloc

disable 1
c
bt

b mmap, 批发的超大块
b brk, 批发heap,调整空间,unix->linux, 1页是4096,0x1000, 2^12

!cat /proc/4327/maps, 查看进程的地址空间

cond 7 (bytes>50000)

dir /home/glibc

disa lic_main

p *((heap_info *)0x7777777) ->ar

fastbin,普通bin, top中virt数值变大

valgrind ./aaa

远程的机器,要开机等在grub界面,选择kgdb等待被调试。
gdb -s vmlinux

!stty -F /dev/ttyS0 115200

target remote /dev/ttyS0
bt

target remote /dev/ttyS0 再输入一次,再次建立远程调试。
bt
info registers 如果是32位的,那么就要改一次,防止远程调试错位。

set architecture i386:x86-64 设置对方为64位架构
bt

/kernel initrd=/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 androidboot.selinux=permissive INSTALL=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值