[英]GDB automatically load Python Script
我正在嘗試設置一個系統,我可以在其中添加python腳本到目錄,下次加載gdb
它們將是可訪問的(關鍵在於將其置於版本控制中,並允許其他工程師簡單訪問我的幫助程序腳本) 。 對於初學者我寫了一個hello.py
文件,當我在gdb
鍵入source /path/to/hello.py
,然后輸入hello
它按預期工作。
如何讓GDB自動執行此操作? 文檔建議使用data-directory,並將腳本放在data-directory/python/gdb/command
。 將我的hello.py
文件放在此目錄中不會執行任何操作(但它最終會創建一個hello.pyc
文件)。
我還嘗試使用dir /path/to/hello/
將此目錄添加到我的目錄列表中,然后希望能夠鍵入source hello.py
但這也會失敗。
創建一個.gdbinit
文件,並將所有source
命令放在您將從中啟動gdb
的同一目錄中。 我相信文件看起來像這樣:
.gdbinit
source /path/to/hello.py
source /path/to/foobar.py
etc, etc
編輯:在版本控件中包含.gdbinit
文件將確保包含文件,與全局gdb
設置無關。
我今天正在尋找同一個問題的答案。 最終我想出了以下內容:
.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)
。
您需要使用以下命令設置auto-load
:
set auto-load python-scripts on
參考 : http : //sourceware.org/gdb/current/onlinedocs/gdb/Python-Auto_002dloading.html#Python-Auto_002dloading
似乎必須有一個更好的方法,但現在我做了以下。 到.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和這些文件都檢入源代碼管理中。
不同但類似的問題:我告訴大家,在他們的主目錄“〜/ .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)
問題解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.