GDB自动加载Python脚本

时间:2012-08-07 17:58:03

标签: python gdb

我正在尝试设置一个系统,我可以在其中添加python脚本到目录,下次加载gdb时,它们将可以访问(这一点是将其置于版本控制中,允许其他工程师轻松访问我的帮助程序脚本)。对于初学者,我写了一个hello.py文件,当我在source /path/to/hello.py中输入 gdb ,然后输入hello时,它会按预期工作。

如何让GDB自动执行此操作?文档建议使用数据目录,并将脚本放在data-directory/python/gdb/command中。将hello.py文件放在此目录中不会执行任何操作(但最终会创建hello.pyc文件)。

我还尝试使用dir /path/to/hello/将此目录添加到我的目录列表中,然后希望能够键入source hello.py,但这也会失败。

5 个答案:

答案 0 :(得分:5)

创建一个.gdbinit文件,并将所有source命令放在您将从gdb开始的同一目录中。我相信文件看起来像这样:

<强> .gdbinit

source /path/to/hello.py
source /path/to/foobar.py
etc, etc

reference

编辑:在版本控制中包含.gdbinit文件将确保包含这些文件,与全局gdb设置无关。

答案 1 :(得分:2)

您需要使用以下命令设置auto-load

set auto-load python-scripts on

参考http://sourceware.org/gdb/current/onlinedocs/gdb/Python-Auto_002dloading.html#Python-Auto_002dloading

答案 2 :(得分:2)

我今天正在寻找同一个问题的答案。最终我想出了以下内容:

<强> .gdbinit

python
import glob

python_dir = "/path/to/python"

# Search the python dir for all .py files, and source each
py_files = glob.glob("%s/*.py" % python_dir)
for py_file in py_files:
    gdb.execute('source %s' % py_file)
end

请注意,.gdbinit可以是~/.gdbinit./.gdbinit;见gdbinit(5)

答案 3 :(得分:1)

似乎必须有更好的方法,但是现在我做了以下事情。至.gdbinit我添加了:source /path/to/setup_python.py

然后我将文件setup_python.py编写为:

#!/usr/bin/python
import glob
import os

# Search the python dir for all .py files, and source each
setup_dir = os.path.dirname(__file__)
python_dir = os.path.join(setup_dir, "python")
py_files = glob.glob("%s/*.py" % python_dir)

for py_file in py_files:
    gdb.execute('source %s' % py_file)

这将获取python子目录中的所有文件,并且可以将setup_python.py和这些文件都检入源代码管理中。

答案 4 :(得分:0)

不同但类似的问题:我告诉大家,在他们的主目录“〜/ .gdbinit”文件中,他们必须通过绝对路径加载一个公共python模块。 这只是一行,而不是复杂的事情。

你应该注意:有人会称之为安全威胁,这是一种平衡行为 - 我必须相信我的团队,他们必须相信我。我这样想:我们都用尖锐的东西工作,我们必须了解我们正在做的事情。每个团队都是独一无二的,用你的判断力。

我还必须处理多个版本的GDB,但是常见的单个.gdbinit文件。例; AndroidOLD(GDB),AndroidNEW(GDB),LinuxHost(GDB)和SomeOther(GDB)

人们在日常工作之间使用不同的东西切换,常见的脚本目录问题。我的主目录中有自己的脚本

我依赖于GDB-Python扩展

import os
import gdb

在Linux上,我可以通过查看可执行文件的绝对路径来确定GDB的完全版本:AndroidOLD(gdb)vrs AndroidNEW(gdb)可以通过查找版本号来确定在路上。

exename = os.readlink( '/proc/self/exe' )

我也可以使用这些项来确定主机类型(cygwin,linux,mac等),以及有关目标架构的更多细节(即:哪个android cpu目标?)

print (gdb.HOST_CONFIG)
# gives: x86_64-linux-gnu
# Alternates: MACOS, or CYGWIN32 or CYGWIN64
print (gdb.TARGET_CONFIG)
# Gives: 64bit android, 32bit android, or something else

现在,更多的原始海​​报问题:一个包含大量脚本的公共目录

  1. 我有多个“公共目录”
  2. 我必须处理不同的架构
  3. 我的员工在项目之间切换
  4. 并在版本之间切换
  5. 某些项目系统具有项目或模块的公共根目录(即:Android),所有子组件都是该公共目录的子目录。使用python - 你可以从当前目录开始,然后一次爬上一个目录树,直到找到一个告诉你更多的魔术文件(例如一些标识android构建根目录的文件)

    现在我知道所有这些,我可以通过以下方式迭代我需要加载的文件:

    import gdb
    gdb.execute('source %s' % filename)
    

    问题解决了。