繁体   English   中英

__libc_start_main中的调试功能

[英]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-dbgdash-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM