gdb中获取进程收到的最近一个信号的信息

简介: gdb中获取进程收到的最近一个信号的信息

参考

命令

p $_siginfo

测试

  • 运行测试程序
$ gdb ./loop
(gdb) start
(gdb) c
Continuing.
  • 通过下面的用户进程向这个测试程序发送SIGUSER1(10)这个信号
$ echo $$
497
$ id
uid=1000(pengdl) gid=1000(pengdl) groups=1000(pengdl),4(adm),27(sudo)
$ kill -10 770
  • gdb这头会自动停下来
Program received signal SIGUSR1, User defined signal 1.
main (argc=1, argv=0xfffffffff458) at ./loop.c:12
12              while(1);
  • 查看最近收到的信号的信息
(gdb) set print pretty on
(gdb) p $_siginfo
$6 = {
  si_signo = 10,
  si_errno = 0,
  si_code = 0,
  _sifields = {
    _pad = {497, 1000, 0 <repeats 26 times>},
    _kill = {
      si_pid = 497,
      si_uid = 1000
    },
    _timer = {
      si_tid = 497,
      si_overrun = 1000,
      si_sigval = {
        sival_int = 0,
        sival_ptr = 0x0
      }
    },
    _rt = {
      si_pid = 497,
      si_uid = 1000,
      si_sigval = {
        sival_int = 0,
        sival_ptr = 0x0
      }
    },
    _sigchld = {
      si_pid = 497,
      si_uid = 1000,
      si_status = 0,
      si_utime = 0,
      si_stime = 0
    },
    _sigfault = {
      si_addr = 0x3e8000001f1
    },
    _sigpoll = {
      si_band = 4294967296497,
      si_fd = 0
    }
  }
}

这个结构体的定义如下:

(gdb) ptype $_siginfo
type = struct siginfo {
    int si_signo;
    int si_errno;
    int si_code;
    union {
        int _pad __attribute__ ((vector_size(28)));
        struct {...} _kill;
        struct {...} _timer;
        struct {...} _rt;
        struct {...} _sigchld;
        struct {...} _sigfault;
        struct {...} _sigpoll;
    } _sifields;
}
(gdb) ptype $_siginfo._sifields
type = union {
    int _pad __attribute__ ((vector_size(28)));
    struct {
        __pid_t si_pid;
        __uid_t si_uid;
    } _kill;
    struct {
        int si_tid;
        int si_overrun;
        union sigval_t si_sigval;
    } _timer;
    struct {
        __pid_t si_pid;
        __uid_t si_uid;
        union sigval_t si_sigval;
    } _rt;
    struct {
        __pid_t si_pid;
        __uid_t si_uid;
        int si_status;
        __clock_t si_utime;
        __clock_t si_stime;
    } _sigchld;
    struct {
        void *si_addr;
    } _sigfault;
    struct {
        long si_band;
        int si_fd;
    } _sigpoll;
}
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
667 10
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
61 1
|
3月前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
29 3
|
3月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
3月前
|
缓存 运维 NoSQL
使用 psutil 获取硬件、网络以及进程信息
使用 psutil 获取硬件、网络以及进程信息
61 0
|
4月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
3月前
|
Linux
查看进程的内存使用信息
查看进程的内存使用信息
|
4月前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【8月更文挑战第1天】在编程世界中,进程间通信(IPC)犹如一场社交舞会,各进程通过IPC机制优雅地交换信息,共同完成复杂任务。IPC就像隐形桥梁,连接并行运行的进程,使它们能跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存和套接字等,适应不同需求。例如,使用`multiprocessing.Queue`实现进程间通信,生产者向队列添加数据,消费者取出并处理数据,两者虽独立却能有效协作。IPC打破了进程界限,使得程序能像社交达人般自由交流,构建出高效、灵活的应用。掌握IPC,让程序信息畅通无阻。
26 1
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
130 0
|
4月前
|
数据安全/隐私保护 异构计算 Windows
【Azure 环境】 介绍两种常规的方法来监视Window系统的CPU高时的进程信息: Performance Monitor 和 Powershell Get-Counter
【Azure 环境】 介绍两种常规的方法来监视Window系统的CPU高时的进程信息: Performance Monitor 和 Powershell Get-Counter