6

我正在尝试设置一个系统,我可以在其中将 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,但这也失败了。

4

5 回答 5

8

创建一个.gdbinit文件,然后将所有source命令放在您将要开始的同一目录中gdb。我相信该文件将如下所示:

.gdbinit

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

参考

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

于 2012-08-07T18:05:15.277 回答
5

我今天正在寻找同样问题的答案。最终我想出了以下几点:

.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)

于 2013-02-22T20:13:25.030 回答
2

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

set auto-load python-scripts on

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

于 2012-08-07T18:04:37.523 回答
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 和这些文件都可以签入源代码控制。

于 2012-08-07T20:43:14.720 回答
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. 并在版本之间切换

一些项目系统有一个项目或模块的公共根目录(即:Android),所有子组件都是该公共目录的子目录。使用 python - 您可以从当前目录开始,然后一次爬上目录树,直到找到一些能告诉您更多信息的神奇文件(例如,一些标识 android 构建的根目录的文件)

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

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

问题解决了。

于 2015-06-26T04:11:45.090 回答