我的任务中遇到了很大的挫败感。我们正在实现一些流程的自动化,这就是这一步。在备份的核心文件上运行GDB命令。命令本身很简单:
gdb --batch --quiet -ex "set logging overwrite on" -ex "set logging file gdb.out" -ex "set pagination off" -ex "set logging on" -ex "pwd" -ex "run" -ex "backtrace full" -ex "info registers" -ex "info threads" -ex "thread apply backtrace full" -ex "set logging off" -ex "quit" binary core
现在有一些回声使文件更具可读性-ex“echo \ n \ nStuff:\ n”......你可以想象。虽然这个命令在从终端窗口手动执行时完美无缺,但我必须从python脚本执行此操作。我以为我会使用子进程模块来帮助我:
subprocess.Popen(['gdb', '--batch', '--quiet', '-ex', '"set logging overwrite on"'...], binary, core)
然而,当我运行它时,每个'ex'之后的命令例如设置日志记录覆盖不存在。 GDB报告:错误未知命令“”并且没有创建输出文件,甚至没有创建具有空字节的文件,但这很明显。 我尝试使用stdin来输入带有输入的gdb,但这根本不起作用,我猜gdb不使用标准输入。哦是的...我们组织中没有用于python的gdb模块,它不是“你应该只安装它”因为我不能这样做。所以我更喜欢我的确切情况的解决方案。带子进程的GDB。
PS:我还试图删除日志文件并从进程中读出stdout ...也没有用。 process.stdout.read()返回一个空字符串,或者当我能得到一些东西时,字符串包含4行,最后500个被截断。
我们的python版本:2.7.3
非常感谢任何提示! (我正式出于想法。)
@Edit:
尝试将命令放在外部文件中并使用--command选项尝试欺骗它。结果,没有创建记录文件,而是先前提到的5行打印到stdout,而其余的保持不变(在回声中截断并丢失了近500行)
通过删除命令周围的引号似乎有一些效果。创建了日志记录文件,但gdb命令的格式化已经消失,而gdb仍然在运行> app.out。
gdb --batch --quiet -ex set logging overwrite on -ex set ...... -ex echo ??Threads:? -ex info threads ...
通过查看正在运行的进程,我可以使用上面的命令看到正在运行的gdb实例。查看文件,我可以看到gdb在运行时卡住> app.out什么都不做。如果我用命令周围的引号手动执行命令,那么从不会发生,因为我用kill -3手动创建核心文件,所以没有错误会阻止gdb运行应用程序直到结束。在使用... gdb(gdbception)检查gdb时,线程处于/ lib64/libc.so.6的sigsuspend中 对我而言,这并不能说实话。