在我的机器上,我有一个aarch64二进制文件,这是静态编译的。 我用-g 6566标志使用qemu-aarch64-static来运行它。 在另一个terminal中,我启动gdb-multiarch ,并将其作为target remote localhost:6566 。
我期望二进制文件提高我在二进制文件中定义的处理程序的信号。 连接到远程后,我在gdb-multiarch内部的处理程序处设置了一个断点。 但是,当信号出现时,gdb-multiarch上的断点不会被触发。 相反,在运行二进制文件的terminal上,我收到了一条消息:
[1] + 8388 suspended (signal) qemu-aarch64-static -g 6566 ./testbinary
为什么会发生? 我怎样才能在处理程序上设置断点并对其进行debugging? 我试过SIGCHLD和SIGFPE。
:处理很多信号
在QueueUserAPC中指定的callback不会被调用
GtkTreeView列标题单击事件
CTRL + C和CTRL + Break是不同的?
信号处理程序在C中停止定时器
在linux中创build一个新的信号
WEXITSTATUS(状态)返回什么?
SIGINT处理和getline
这对我最近的QEMU有效:
$ cat sig.c #include <stdlib.h> #include <signal.h> #include <stdio.h> void handler(int sig) { printf("In signal handler,signal %dn",sig); return; } int main(void) { printf("hello worldn"); signal(SIGUSR1,handler); raise(SIGUSR1); printf("donen"); return 0; } $ aarch64-linux-gnu-gcc -g -Wall -o sig sig.c -static $ qemu-aarch64 -g 6566 ./sig
然后在另一个窗口中:
$ gdb-multiarch GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 [etc] (gdb) set arch aarch64 The target architecture is assumed to be aarch64 (gdb) file /tmp/sigs/sig Reading symbols from /tmp/sigs/sig...done. (gdb) target remote :6566 Remote debugging using :6566 0x0000000000400c98 in _start () (gdb) break handler Breakpoint 1 at 0x400e44: file sig.c,line 6. (gdb) c Continuing. Program received signal SIGUSR1,User defined signal 1. 0x0000000000405c68 in raise () (gdb) c Continuing. Breakpoint 1,handler (sig=10) at sig.c:6 6 printf("In signal handler,sig); (gdb)
正如你所看到的,gdb在进程接收到信号时立即获得控制权,然后在处理函数的断点处再次获得控制权。
顺便提一下,(整数)除以零不是激发信号的可靠方法。 这在C中是未定义的行为,并且实现可以自由地做最方便的事情。 在x86上,这通常会导致SIGFPE。 在ARM上,您通常会发现结果为零,并且执行将继续进行,而没有信号。 (这是两个体系结构之间划分底层硬件指令的不同行为的体现。)
我正在为您的答案做一些研发,并找到如下答案
“在内部,坏的内存访问导致马克例外EXC_BAD_ACCESS被发送到程序,通常情况下,这被转换成一个SIGBUS UNIX信号,但gdb在信号转换之前直接截取马赫例外,解决办法是给gdb命令在运行你的程序之前设置dont-handle-bad-access 1,然后使用正常的机制,并且在你的信号处理程序中的断点将被遵守。
链接是gdb:为SIGBUS处理程序设置一个断点它可能帮助你考虑到qemu不会改变基本操作的功能
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。