1
바이너리에서 매우 드문 경우가 있습니다.디버깅이 libc.so.6의 std :: cout에 stalled()되었습니다.
gdb를 부착하고 관련 스레드로 전환하는 것은
(gdb) bt
#0 0x000000330a4db79d in write() from /lib64/libc.so.6
#1 0x000000330a471dd3 in _IO_new_file_write() from /lib64/libc.so.6
#2 0x000000330a473385 in _IO_new_do_write() from /lib64/libc.so.6
#3 0x000000330a4726df in _IO_new_file_overflow() from /lib64/libc.so.6
#4 0x000000330a46f437 in putc() from /lib64/libc.so.6
#5 0x00007f92d94864ea in sputc (__c=10 '\n', this=<optimized out>) at [..omitted..]/gcc-4.9.0-objdir/x86_64-linux-gnu/libstdc++-v3/include/streambuf:434
#6 std::ostream::put (this=0x3171f40 <std::cout>, __c=<optimized out>) at [..omitted..]/gcc-4.9.0-objdir/x86_64-linux-gnu/libstdc++-v3/include/bits/ostream.tcc:163
를 제공하고 strace를 그것은 수 std :: cout을를 작성, 영원히되고있다
Process 14702 attached - interrupt to quit
write(1, "[...some string...]", 31
제공합니다. 다른 어떤 정보를 수집해야합니까? 어떻게하면이 바닥에 도달해야합니까?
편집 : cout
파이프로 재 진은 파이썬 시스템에 의해 호출 , 매우 깊은 내부가하고있어
pipe = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
output = pipe.stdout.read()
pipe.wait()
'cout'이 파이프로 재 지정되고 대상 프로그램이 파이프에서 읽기 전에 다른 소스의 입력을 페이징하거나 대기하는 경우는 매우 일반적입니다. –
답장을 보내 주셔서 감사합니다. 바이너리는 실제로 파이썬의 서브 프로세스에 의해 호출됩니다. C++ 측에서 할 수있는 것이 있습니까? 아니면 파이썬 측에서 작업해야합니까? – hahaha
그것은 올바른 행동이 무엇인지에 달려 있습니다. 출력이 읽히지 않으면 C++ 프로세스는 어떻게해야합니까? 기다려야할까요? 그것이 기다리지 않고 계속되어야 하는가? 파이썬 하위 프로세스가 가능한 빨리 C++ 프로세스의 모든 출력을 읽어야합니까? 무슨 일이 일어나야하는지 파악하고 그 일을 실현하십시오. –