CentOS:gdb挂起了读取取消呼叫

CentOS:gdb挂起了读取取消呼叫,gdb,centos7,Gdb,Centos7,我将gdb附加到一个使用调试标志编译的可执行文件gdb挂起\u read\u nocancel调用。若我运行可执行文件而不附加gdb,那个么一切都很好,应用程序正常退出并获得预期结果 我在谷歌上搜索了一下,但找不到任何具体的东西。有人能提出任何解决方案或解决办法吗?这是一个已知的问题吗 编辑: 事实证明,我使用forks并在后台使用Python的库。在我切换到下一个并继续后,程序挂起 Reading symbols from /usr/bin/python2.7... [Attaching af

我将
gdb
附加到一个使用调试标志编译的可执行文件
gdb
挂起
\u read\u nocancel
调用。若我运行可执行文件而不附加
gdb
,那个么一切都很好,应用程序正常退出并获得预期结果

我在谷歌上搜索了一下,但找不到任何具体的东西。有人能提出任何解决方案或解决办法吗?这是一个已知的问题吗

编辑:

事实证明,我使用forks并在后台使用Python的库。在我切换到
下一个
并继续后,程序挂起

Reading symbols from /usr/bin/python2.7...
[Attaching after process 13040 fork to child process 13041]
[New inferior 3 (process 13041)]
process 13041 is executing new program: /usr/bin/uname
[Inferior 3 (process 13041) exited normally]
(gdb) inferior 1
[Switching to inferior 1 [process 12455] (/usr/bin/python2.7)]
[Switching to thread 1.1 (Thread 0x7fec1cee5740 (LWP 12455))]
#0  0x00007fec1bc8cf42 in fork () from /lib64/libc.so.6
(gdb) c
Continuing.
^C
Thread 1.1 "python" received signal SIGINT, Interrupt.
0x00007fec1bcb6f70 in __read_nocancel () from /lib64/libc.so.6
(gdb) where
#0  0x00007ffff6db2f70 in __read_nocancel () from /lib64/libc.so.6
#1  0x00007ffff6d3fb14 in __GI__IO_file_underflow () from /lib64/libc.so.6
#2  0x00007ffff6d41063 in _IO_default_xsgetn () from /lib64/libc.so.6
#3  0x00007ffff6d32fdf in fread () from /lib64/libc.so.6
#4  0x00007ffff7a364ca in file_read (f=0x7fffeac4f8a0, args=<optimized out>) at Objects/fileobject.c:1084
#5  0x00007ffff7ac6345 in call_function (oparg=<optimized out>, pp_stack=0x7ffffffef5e0) at Python/ceval.c:4352
从/usr/bin/python2.7读取符号。。。
[在进程13040之后将fork连接到子进程13041]
[新流程3(流程13041)]
进程13041正在执行新程序:/usr/bin/uname
[下级3(进程13041)正常退出]
(gdb)次1
[切换到低级1[进程12455](/usr/bin/python2.7)]
[切换到线程1.1(线程0x7fec1cee5740(LWP 12455))]
#来自/lib64/libc.so.6的fork()中的0 0x00007fec1bc8cf42
(gdb)c
持续的。
^C
线程1.1“python”收到信号SIGINT,中断。
0x00007fec1bcb6f70位于/lib64/libc.so.6中的
(gdb)在哪里
#0 0x00007ffff6db2f70位于/lib64/libc.so.6中的
#1 0x00007ffff6d3fb14位于/lib64/libc.so.6中的\uuuuuu GI\uuuuuu IO\u文件\u下溢()中
#来自/lib64/libc.so.6的2 0x00007ffff6d41063 in_IO_default_xsgetn()
#3/lib64/libc.so.6中fread()中的0x00007ffff6d32fdf
#在Objects/fileobject.c:1084处读取文件(f=0x7fffeac4f8a0,args=)中的4 0x00007ffff7a364ca
#在Python/ceval.c:4352处调用函数(oparg=,pp_stack=0x7fffffff5e0)中的5 0x00007ffff7ac6345
[在进程18291之后连接到子进程18293]
[新程序3(程序18293)]
进程18293正在执行新程序:/usr/bin/uname
[下级3(进程18293)正常退出]
(gdb)信息劣势
Num描述可执行文件
1过程18271/opt/cpp_材料/测试/测试
2流程18291/usr/bin/bash
*3/usr/bin/uname
(gdb)
gdb挂起读取取消呼叫。若我在不附加gdb的情况下运行可执行文件,那个么一切都很好,应用程序正常退出,并获得预期的结果

否:GDB没有挂起

您的应用程序(python)在尝试从某个
文件中删除时被阻止。输入
python
预期永远不会出现,因此它将永远等待

你还没有提供足够的信息让我们知道第一个次等者试图从中读取什么,以及为什么输入永远不会出现

Mark Plotnick的猜测是,您有另一个已停止的次品(2?),并且应该产生次品1正在等待的输出,这可能是正确的。如果是这样的话,你需要恢复另一个劣势

gdb挂起读取取消呼叫。若我在不附加gdb的情况下运行可执行文件,那个么一切都很好,应用程序正常退出,并获得预期的结果

否:GDB没有挂起

您的应用程序(python)在尝试从某个
文件中删除时被阻止。输入
python
预期永远不会出现,因此它将永远等待

你还没有提供足够的信息让我们知道第一个次等者试图从中读取什么,以及为什么输入永远不会出现


Mark Plotnick的猜测是,您有另一个已停止的次品(2?),并且应该产生次品1正在等待的输出,这可能是正确的。如果是这样,您需要恢复另一个下级。

您的应用程序是多线程的吗?您可以在问题中添加操作系统的名称吗?您好,我已经更新了信息,我还添加了相关的详细信息。我不确定这是否可能,但是,如果有一种方法可以根据fork的上下文选择
detach on fork
行为(例如,popen或子流程调用的
on
,以便它们不受阻碍地运行),那会有帮助吗?我需要考虑一下。我发现我可以
捕获fork
,然后执行
set detach on fork on | off
命令,在
continue
之后,该命令将影响该fork创建的下位机。因此,您可以为每个fork使用脚本函数(如
$\u caller\u is
)来做出决定。您的应用程序是多线程的吗?您可以在问题中添加操作系统的名称吗?您好,我已经更新了信息,还添加了相关的详细信息。我不确定这是否可行,但是,如果有一种方法可以根据fork的上下文选择
detach on fork
行为(例如,popen或子流程调用的
on
,以便它们不受阻碍地运行),那会有帮助吗?我需要考虑一下。我发现我可以
捕获fork
,然后执行
set detach on fork on | off
命令,在
continue
之后,该命令将影响该fork创建的下位机。因此,您可以为每个fork使用脚本函数(如
$\u caller\u is
)做出决定。您好,谢谢您的回复。为什么我的应用程序在没有附加调试程序的情况下运行时没有等待?我怎样才能恢复其他的工作<代码>次品2
然后
继续
?您好,谢谢您的回复。为什么我的应用程序在没有附加调试程序的情况下运行时没有等待?我怎样才能恢复其他的工作<代码>次2
然后
继续
[Attaching after process 18291 fork to child process 18293]
[New inferior 3 (process 18293)]
process 18293 is executing new program: /usr/bin/uname
[Inferior 3 (process 18293) exited normally]
(gdb) info inferiors 
  Num  Description       Executable        
  1    process 18271     /opt/cpp_stuff/tests/test
  2    process 18291     /usr/bin/bash     
* 3    <null>            /usr/bin/uname    
(gdb)