[英]Debugging functions in __libc_start_main
我正在编写一个库,该库挂钩了一些CUDA函数以添加一些功能。 “构造函数”挂钩CUDA功能,并设置消息队列和共享内存以与其他挂钩的CUDA二进制文件进行通信。 当启动几个挂钩的CUDA二进制文件时(通过python subprocess.Popen('<path-to-binary>', shell=True)
),一些进程挂起。 因此,我使用gdb -p <pid>
附加了一个挂起的进程,希望找出问题所在。 结果如下:
Attaching to process 7445
Reading symbols from /bin/dash...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.27.so...done.
done.
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/ld-2.27.so...done.
done.
0x00007f9cefe8b76a in wait4 () at ../sysdeps/unix/syscall-template.S:78
78 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) bt
#0 0x00007f9cefe8b76a in wait4 () at ../sysdeps/unix/syscall-template.S:78
#1 0x000055fff93be8a0 in ?? ()
#2 0x000055fff93c009d in ?? ()
#3 0x000055fff93ba6d8 in ?? ()
#4 0x000055fff93b949e in ?? ()
#5 0x000055fff93b9eda in ?? ()
#6 0x000055fff93b7944 in ?? ()
#7 0x00007f9cefdc8b97 in __libc_start_main (main=0x55fff93b7850, argc=3, argv=0x7ffca7c7beb8, init=<optimized out>,
fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffca7c7bea8) at ../csu/libc-start.c:310
#8 0x000055fff93b7a4a in ?? ()
我已经添加了-g
标志,但似乎该程序在进入main
之前挂在wait4
。
感谢您对以下方面的任何见解:
??
../csu/libc-start.c:310
在哪里? 系统信息: gcc 6.5.0
,带有4.15.0-54-generic
Ubuntu 18.04
。
如何加载这些调试符号以摆脱
??
您似乎需要/bin/dash
的调试符号,这些调试符号可能会放在名为dash-dbg
或dash-dbgsym
或类似dash-dbg
中。
另外,我怀疑如果使用-fno-optimize-sibling-calls
编译库,则堆栈跟踪会更有意义。
../csu/libc-start.c:310
在哪里?
看到这个答案 。
我还能做些什么来查找错误?
您说过您正在编写一个使用__attribute__((constructor))
,但是您显示了/bin/dash
(我认为是DASH而不是您编写的程序)的堆栈跟踪,该跟踪似乎不涉及您的符号图书馆。 由此推断,您的库已使用LD_PRELOAD
加载到了不希望它存在的程序中。
这两件事LD_PRELOAD
和__attribute__((constructor))
破坏了所涉及的任何毫无怀疑的程序和C库的正常期望。 只有在没有其他选择的情况下 ,才应执行这些操作,并且应尝试在注入的代码中尽可能少地执行操作。 (特别是,我认为任何涉及不从构造函数中生成过程的设计都是可行的。)如果您告诉我们您的更大目标,我们也许可以提出一些麻烦较少的替代方法。
编辑:
subprocess.Popen('<path-to-binary>', shell=True)
使用shell=True
,Python不会直接调用程序,而是运行/bin/sh -c 'string passed to Popen'
形式的命令。 在许多情况下,这自然会导致/bin/dash
进程在实际二进制文件的整个生命周期中的wait
系统调用中处于休眠状态(未挂起)。 除非您实际上需要在运行程序之前评估一些外壳程序代码,否则请尝试使用默认的shell=False
代替,看看是否可以解决您的问题。 (如果确实需要评估shell代码,请尝试Popen('<shell code>; exec <binary>', shell=True)
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.