- 论坛徽章:
- 0
|
本帖最后由 looper0001 于 2016-04-08 22:23 编辑
最近在分析一个coredump的问题,但是由于core不完整,导致无法直观的看到案发现场的调用栈,只能通过栈桢结构反推。
但是,由于注册了信号捕获函数core_handler。
也就是,coredump发生时,进程捕获到coredump信号(如:11信号,07信号等),需要先保护现场(寄存器等信息)
之后再通过系统调用,进入信号处理函数core_handler。
但是查了很多资料,没有明确找到,系统调用时的现场保护,压栈了哪些内容?压栈顺序是怎么样的?
在系统调用这一栈桢看到的内容,环境是x64 suse11的:
gdb查看rsp往上的 22 * 8字节内容,但是不知道前面 5 * 8字节保存的是什么内容?
x /22xg $rsp
? | ? | ? | ? | ? | r8寄存器 | r9寄存器 | r10寄存器 | r11寄存器 | r12寄存器 | r13寄存器 | r14寄存器 | r15寄存器 | rbp寄存器 | rdi寄存器 | rsi寄存器 | rdx寄存器 | rbx寄存器 | rcx寄存器 | rax寄存器 | rsp寄存器 | rip寄存器 |
有看到关于SAVE_ALL宏的介绍,但是这个应该是32位系统的,对于64位系统应该不一样的吧?
#define SAVE_ALL \
cld; \
pushl %es; \
pushl %ds; \
pushl %eax; \
pushl %ebp; \
pushl %edi; \
pushl %esi; \
pushl %edx; \
pushl %ecx; \
pushl %ebx; \
movl $(__USER_DS), %edx; \
movl %edx, %ds; \
movl %edx, %es;
|
|