我做了一些有关注册信号处理程序的小汇编代码。
.section .data
.set SIGSEGV, 11
.set SA_SIGINFO, 4
.section .bss
.lcomm my_sigaction, 140 # size of sigaction struction is 140
.section .text
.global main
myhandler:
nop
push %eax
pop %eax
main:
# Registring signal handler for SIGSEGV
movl $myhandler, my_sigaction # fill sa_handler field
movl $132, %edi # fill sa_flags field
movl $SA_SIGINFO, my_sigaction(,%edi,1) # SA_SIGINFO designate that whenever signal appears, run the signal handling function.
# Call sigaction(int, const struct sigaction *, struct sigaction *)
pushl $0 # 1st param : oact
pushl $my_sigaction # 2nd param : act
pushl $SIGSEGV # 3rd param : sig
call sigaction
addl $12, %esp
jmp 0x11223344 # Segmantation fault
当我执行编译后的二进制文件时,myhandler
工作得很好。
但是...当我尝试调试它时, gdb 在 SIGSEGV 信号出现后才停止。
因此,我无法通过 gdb 到达myhandler
。.
问题。
如何调试在SIGSEGV信号之后运行的myhandler
函数?
PS 1。 我检查了here,但是在我的情况下设置Follow-process-mode并没有帮助。 ;(
PS 2。 我检查了here,但是断言handle SIGSEGV nostop
之后,gdb无限地发出“程序接收信号SIGSEGV,分段错误”发生SIGSEGV时出现消息...
答案 0 :(得分:3)
我自己解决了这个问题。
pwndbg> b myhandler
pwndbg> handle SIGSEGV pass
Signal Stop Print Pass to program Description
SIGSEGV Yes Yes Yes Segmentation fault
pwndbg> handle SIGSEGV nostop
Signal Stop Print Pass to program Description
SIGSEGV No Yes Yes Segmentation fault
pwndbg> r
Breakpoint myhandler
在SIGSEGV信号上设置pass
和nostop
有用!
发生SIGSEGV之后,我仍然可以在gdb上调试二进制文件。