我正在尝试设置一个系统,我可以在其中添加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
,但这也会失败。
答案 0 :(得分:5)
创建一个.gdbinit
文件,并将所有source
命令放在您将从gdb
开始的同一目录中。我相信文件看起来像这样:
<强> .gdbinit 强>
source /path/to/hello.py
source /path/to/foobar.py
etc, etc
编辑:在版本控制中包含.gdbinit
文件将确保包含这些文件,与全局gdb
设置无关。
答案 1 :(得分:2)
您需要使用以下命令设置auto-load
:
set auto-load python-scripts on
答案 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
现在,更多的原始海报问题:一个包含大量脚本的公共目录
某些项目系统具有项目或模块的公共根目录(即:Android),所有子组件都是该公共目录的子目录。使用python - 你可以从当前目录开始,然后一次爬上一个目录树,直到找到一个告诉你更多的魔术文件(例如一些标识android构建根目录的文件)
现在我知道所有这些,我可以通过以下方式迭代我需要加载的文件:
import gdb
gdb.execute('source %s' % filename)
问题解决了。