2014-11-29 1 views
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() 
+0

'cout'이 파이프로 재 지정되고 대상 프로그램이 파이프에서 읽기 전에 다른 소스의 입력을 페이징하거나 대기하는 경우는 매우 일반적입니다. –

+0

답장을 보내 주셔서 감사합니다. 바이너리는 실제로 파이썬의 서브 프로세스에 의해 호출됩니다. C++ 측에서 할 수있는 것이 있습니까? 아니면 파이썬 측에서 작업해야합니까? – hahaha

+0

그것은 올바른 행동이 무엇인지에 달려 있습니다. 출력이 읽히지 않으면 C++ 프로세스는 어떻게해야합니까? 기다려야할까요? 그것이 기다리지 않고 계속되어야 하는가? 파이썬 하위 프로세스가 가능한 빨리 C++ 프로세스의 모든 출력을 읽어야합니까? 무슨 일이 일어나야하는지 파악하고 그 일을 실현하십시오. –

답변

1

경우, 출력은 차단됩니다 경우의 다른 쪽 끝에있는 과정 파이프가 충분히 빨리 읽을 수 없습니다. cout 블록에 쓰거나 파이프의 다른 쪽 끝을 파이프에서 읽어야하는지 여부를 결정하는 경우에도 C++ 프로세스를 계속 진행시켜야하는지 여부를 결정해야합니다. 고장난 부분을 찾아서 수정하십시오.

관련 문제