我经常使用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会很痛苦。)
答案 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
才能生效。