zoukankan      html  css  js  c++  java
  • gdb中信号

    信号(Signals)

    信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。UNIX定义了许 多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号; SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。

    GDB有能力在你调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB的handle命令来完成这一功能。

    handle
    在GDB中定义一个信号处理。信号可以以SIG开头或不以 SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO, SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以 供调试。其可以是以下几种关键字的一个或多个。

    nostop
    当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。
    stop
    当被调试的程序收到信号时,GDB会停住你的程序。
    print
    当被调试的程序收到信号时,GDB会显示出一条信息。
    noprint
    当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
    pass
    noignore
    当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
    nopass
    ignore
    当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。


    info signals
    info handle
    查看有哪些信号在被GDB检测中。
     

    信号的处理
    程序是和网络相关的,调试期间经常地收到SIGPIPE,导致gdb停下来。看了一下gdb info,解决方法很简单。用handle命令设置一下缺省signal的处理行为就可以了:
       handle SIGPIPE nostop
    如果连提示信息都不想看见,就可以这样设置:
       handle SIGPIPE nostop noprint
    就可以了。其他相关信号也可以类似处理。想了解目前的signal状态可以使用info signal察看。

    写了一个INT信号的处理函数,在处理函数里设置断点后go,但是在console下按Ctrl-C后MC并没有进入处理函数,而console下的程序也直接退出,没有给出希望的输出。

        --------------------------------------------------------------------------------

        在console下按Ctrl-C后确实发送了SIGINT信号,但是gdb里的缺省设置将会导致由GDB截获的该信息,调试的应用程序无法接受到该信号。

        有两种方法可以使调试的应用程序接受到信号:

        (1)改变gdb信号处理的设置

        比如,以下设置会告诉gdb在接收到SIGINT时不要停止、打印出来、传递给调试目标程序

        =====================================

        (gdb) handle SIGINT nostop print pass

        SIGINT is used by the debugger.

        Are you sure you want to change it? (y or n) y

        Signal Stop Print Pass to program Description

        SIGINT No Yes Yes Interrupt

        (gdb)

        =====================================

        (2)使用gdb命令直接向调试的应用程序发送信号

        首先在你希望发送信号的语句处设置断点,然后运行程序,当停止到断点所在位置后,用gdb的signal命令发送信号给调试目标程序

        ====================================

        (gdb) signal SIGINT

        Continuing with signal SIGINT.

        Breakpoint 1, handler (signal=2) at main.cpp:15

        15 printf("Signal handler... "

        

        

  • 相关阅读:
    AntDesign(React)学习-9 Dva model reducer实践
    AntDesign(React)学习-8 Menu使用 切换框架页内容页面
    AntDesign(React)学习-7 Menu添加事件
    AntDesign(React)学习-6 Menu展示数据
    AntDesign(React)学习-5 路由及使用Layout布局
    AntDesign(React)学习-4 登录页面提交数据简单实现
    AntDesign(React)学习-3 React基础
    AntDesign(React)学习-2 第一个页面
    AntDesign(React)学习-1 创建环境
    正则表达式分组捕获非捕获的示例理解
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/4752649.html
Copyright © 2011-2022 走看看