簡體   English   中英

GDB自動加載Python腳本

[英]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

現在,更多的原始海​​報問題:一個包含大量腳本的公共目錄

  1. 我有多個“共同目錄”
  2. 我必須處理不同的架構
  3. 我的員工在項目之間切換
  4. 並在版本之間切換

一些項目系統具有項目或模塊的公共根目錄(即:Android),並且所有子組件是該公共目錄的子目錄。 使用python - 你可以從當前目錄開始,然后一次爬上一個目錄樹,直到找到一個告訴你更多的魔術文件(例如一些標識android構建根目錄的文件)

既然我知道所有這些,我可以迭代我需要加載的文件:

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

問題解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM