调试使用带有gdb的SIGINT的程序

时间:2016-05-03 00:51:18

标签: c postgresql debugging gdb

我经常使用PostgreSQL进行调试,并在内部使用SIGINT进行一些后端后端信令。

因此,在gdb执行下运行某些后端时,往往会中断很多。可以使用signal命令确保将SIGINT传递给程序,并且gdb不会捕获它...但是gdb没有响应在命令行上使用control-C,因为它发送SIGINT

如果你跑:

handle SIGINT noprint nostop pass

gdb会抱怨

SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y

有没有办法让gdb使用不同的中断信号?或者让我gdb忽略SIGINT

的替代方法

(对于大多数PostgreSQL后端调试来说,这不是问题,但背景工作者和autovacuum会很痛苦。)

3 个答案:

答案 0 :(得分:11)

在这个问题的变体略有不同的情况下,最终在这个页面上的读者(正如我所做的那样)可能会对这个问题更感兴趣:

Debugging a segmentation fault when I do ctrl c

......及其答案,即:

  • 从gdb内部发送SIGINT:

    (gdb)signal 2

(通常我会在本页的OP问题下将链接发布为简单评论,但由于已有7条评论,评论被隐藏/隐藏。)

如果你在这里阅读了OP问题的所有细节,那么显然我的答案对于OP来说是不正确的。

但是,对于许多可以用相同标题描述的情况,我的回答是正确的:“调试使用带有gdb的SIGINT的程序”

答案 1 :(得分:5)

在类UNIX系统上,您可以通过查看siginfo结构中的kill元素来区分tty发起的SIGINT和si_pid发送的SIGINT。如果pid为0,则来自tty。

所以你可以这样做:

catch signal SIGINT
commands
  if $_siginfo._sifields._kill.si_pid == 0
    print "Received SIGINT from tty"
  else
    printf "Received SIGINT from %d; continuing\n", $_siginfo._sifields._kill.si_pid
    signal SIGINT
  end
end

答案 2 :(得分:3)

gdb的这一部分有点棘手,既由于它的历史,也是由于它支持的各种操作模式。

有人可能会认为在一个单独的终端中运行gdb而只使用LocalDate date = LocalDate.now(); DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm"); String str = date.toString(fmt); 会帮助它做正确的事情,但我不认为这很容易。

前进的方法可能是在调试时仅使用异步执行,然后使用命令来中断下级。类似的东西:

attach

根据您的gdb版本,您可能需要设置(gdb) attach 5555 ... attaches (gdb) continue & ... lots of stuff happens (gdb) interrupt -a 才能生效。