Linux 在调试select()时,如何强制进程从调用返回

Linux 在调试select()时,如何强制进程从调用返回,linux,gdb,valgrind,Linux,Gdb,Valgrind,我在gdb下运行一个服务器,它当前在一个select调用中被阻止 我想让它从select返回,然后我可以手动修改fd集并查看执行如何继续 我试图在调用select()后的下一行上放置一个断点,并发出命令“signal SIGINT”,但除了打印“continue with signal SIGINT”之外,什么也没做 编辑:我实际上正在使用vgdb进行调试,也许这就是问题所在?您可以尝试使用jump命令。它的位置与break的位置类似,因此您可以将行或地址指定为*ADDR。请在gdb提示符下尝试

我在gdb下运行一个服务器,它当前在一个select调用中被阻止

我想让它从select返回,然后我可以手动修改fd集并查看执行如何继续

我试图在调用select()后的下一行上放置一个断点,并发出命令“signal SIGINT”,但除了打印“continue with signal SIGINT”之外,什么也没做


编辑:我实际上正在使用vgdb进行调试,也许这就是问题所在?

您可以尝试使用
jump
命令。它的位置与
break
的位置类似,因此您可以将行或地址指定为
*ADDR
。请在gdb提示符下尝试
帮助跳转
,以获取更多信息


通常,当我跳转的距离很小时,我使用此命令最成功,否则,过多的程序状态对于程序来说是不正确的,无法正常执行任何操作,但是跳出系统调用,特别是当计划修补返回状态时,可能会很好。

您可以尝试使用
跳转
命令。它的位置与
break
的位置类似,因此您可以将行或地址指定为
*ADDR
。请在gdb提示符下尝试
帮助跳转
,以获取更多信息


通常,当我跳转的距离很小时,我使用这个命令最成功,否则,过多的程序状态对于程序来说是不正确的,不能做任何正常的事情,但是跳出系统调用,特别是如果计划修补返回状态,无论如何都可能会很好地工作。

Valgrind gdbserver+vgdb仅部分支持GDB命令“signal sig” 自3.11版(2015年9月23日刚刚发布)起。 版本3.10和之前的版本完全忽略了GDB指令 继续发送信号或更改信号

在3.11版中,部分支持“信号SIG”:如果进程 向GDB报告了一个信号,可以忽略该信号(使用信号0) 或者可以更改(使用信号othersignr)

Valgrind gdbserver当前不支持从GDB发出信号

此外,当系统调用中的线程被阻塞时,Valgrind gdbserver 将不接受GDB指令以从中“跳出”或“返回”
系统调用。

Valgrind gdbserver+vgdb仅部分支持GDB命令“信号sig” 自3.11版(2015年9月23日刚刚发布)起。 版本3.10和之前的版本完全忽略了GDB指令 继续发送信号或更改信号

在3.11版中,部分支持“信号SIG”:如果进程 向GDB报告了一个信号,可以忽略该信号(使用信号0) 或者可以更改(使用信号othersignr)

Valgrind gdbserver当前不支持从GDB发出信号

此外,当系统调用中的线程被阻塞时,Valgrind gdbserver 将不接受GDB指令以从中“跳出”或“返回”
syscall.

我不确定您是否可以这样做,但由于您只希望用于调试目的,因此只需向fd集添加一个文件描述符(例如创建命名管道)。因此,在调试期间,select通常会被阻止,等待其任何文件描述符上的输入,但您只需将某些内容写入命名管道(通过终端)即可解锁调用。我不确定这是否满足您的需要,但它可能会作为调试会话的简单解决方法。我不确定您是否可以这样做,但由于您只希望用于调试目的,因此只需将文件描述符添加到fd集(例如创建命名管道)。因此,在调试过程中,select通常会被阻止,等待其任何文件描述符的输入,但您可以通过向命名管道写入内容(通过终端)来解锁调用。我不确定这是否满足您的需要,但它可能是调试会话的简单解决方法。