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