2012-08-07 85 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) 

問題已解決。