2012-08-07 83 views
1

我想设置一个系统,我可以将python脚本添加到一个目录中,并且下次我加载gdb时,他们将可以访问(要将它放在版本控制中并允许其他工程师简单访问我的帮手脚本)。对于初学者,我写了一个hello.py文件,当我输入source /path/to/hello.pygdb,然后键入hello它按预期工作。GDB自动加载Python脚本

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

我已经额外尝试添加此目录到我的目录列表dir /path/to/hello/,然后希望能够键入source hello.py,但这也失败了。

+0

你是什么意思自动?你的意思是将所有Python脚本加载到给定的目录中吗?或当前目录?或者是其他东西? – 2015-10-19 10:20:37

回答

2

你需要设置auto-load上使用以下命令:

set auto-load python-scripts on 

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

+0

我看到了,但每当我尝试输入时(无论是在gdb中,还是将其放入我的.gdbinit中),它都会给我提供错误:“开”或“关”。我认为这只是调用它为“自动加载”和传递“python脚本”所做的。 – Dave 2012-08-07 19:34:42

2

做一个.gdbinit文件,并把你的所有source命令中有在同一目录你将从哪里开始gdb。我相信,该文件将是这个样子:

.gdbinit

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

reference

编辑:包括.gdbinit文件版本控制将确保这些文件都包括在内,独立的全球gdb设置。

+0

谢谢。这确实有用,但我希望有一些能够以更自动化的方式做到这一点。这需要手动将每个脚本添加到.gdbinit,再加上一个完整路径(我试图在没有完整路径的情况下获取python文件导致奇怪的错误)。我想我可以有一个bash脚本,它会自动生成一个.gdbinit文件,并根据用户设置版本控制的位置传递所有路径,但我希望GDB设计人员能够为此设置钩子。 – Dave 2012-08-07 19:37:41

+0

也许你可以将.gdbinit的代码添加到你的Makefile中?我同意,这太糟糕了,没有一个干净的做法(我知道)。 – 2012-08-07 19:47:38

+0

我觉得我必须错过简单的东西。特别是有关数据目录[这里]的最后一行(http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html)。但有第二个人不清楚帮助我构成了一个骇人听闻的解决方案。谢谢! – Dave 2012-08-07 20:37:11

0

看来必须有更好的方法,但现在我做了以下。为了.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) 

这将源蟒蛇子目录中的所有文件,都setup_python.py和这些文件可签入源代码管理。

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)

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. 我必须处理d ifferent架构
  3. 我的百姓,在项目之间进行切换
  4. 之间切换版本

一些项目的系统都有一个共同的根目录:该项目或模块(即Android设备),和所有的子组件子目录该通用目录。使用python - 你可以从当前目录开始,然后爬上目录树,一次一个,直到找到一些可以告诉你更多的魔术文件(例如某个标识android版本根目录的文件)

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

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

问题已解决。