web-dev-qa-db-ja.com

gdbのpy-btを有効にできません

Python 3.5をダウンロードしてコンパイルしました。問題なく動作します。問題は、gdbを使用して、CPUの過剰使用に関する微妙なバグをデバッグする必要があることですpythonプログラムの実行。

公式Python gdb extension に関するドキュメンテーション)から、彼らがする唯一のことは追加することです

add-auto-load-safe-path /path/to/dir/with/python-gdb.py

~/.gdbinit。私はそれをテストしました

gdb --args /path/to/python3.5/binary
(gdb) py-bt

しかし私は得る

Undefined command: "py-bt"

gdbはバージョン7.2であり、pythonサポートが有効になっています。

14
Marco Sulla

それを見つけた! PYTHONPATH/PATH_TO_PYTHON_SRC/Tools/gdbを追加する必要があります。その後、gdbで実行できるようになります。

python import libpython

ソース: https://sumitkgaur.wordpress.com/2014/05/13/python-debugging/

6
Marco Sulla

gdbを使用したCPythonプロセスのデバッグ によるブログ投稿に基づく問題を解決するもう1つの方法は、python3.5-gdb.pyファイルを入手することです。コマンドinfo auto-loadを実行して、ファイルが読み込まれていることを確認し(読み込まれている場合)、読み込まれていない場合は手動で読み込みます:source /usr/share/gdb/auto-load/usr/bin/python3.5-gdb.py(!パスは異なる場合があります)。

その後、py-btが機能するはずです。

編集:pyバージョンを変更

14
Alex Bender

gdbは、gdb CLI(またはPythonまたはScheme)スクリプトを自動ロードします scripts-directory 検索パスのディレクトリをルートとするディレクトリツリーを調べます。またはロードされた共有オブジェクトの場合、gdbはobjfile-gdb.gdb(またはobjfile-gdb.pyまたはobjfile-gdb.scm)という名前のスクリプトを探します。

pythonのgdb拡張機能を自動ロードする1つの方法は、ダウンロードしたpython-gdb.pyファイルを、scripts-directoryパスのいずれかのディレクトリの下に配置することです。たとえば、Ubuntuのpython2.7-dbgパッケージは、次のファイルをインストールします。

-rwxr-xr-x /usr/lib/debug/usr/bin/python2.7-gdb.py
lrwxrwxrwx /usr/lib/debug/usr/lib/libpython2.7.so.1.0-gdb.py -> ../bin/python2.7-gdb.py

以下は、python2.7-gdb.py実行可能ファイルのデバッグを開始したときに/usr/bin/pythonスクリプトがどのように自動ロードされるかを示すgdbセッションです。

(gdb) show auto-load scripts-directory
List of directories from which to load auto-loaded scripts is $debugdir:$datadir/auto-load.
(gdb) set debug auto-load
(gdb) file /usr/bin/python
Reading symbols from /usr/bin/python...Reading symbols from /usr/lib/debug//usr/bin/python2.7...done.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Expanded $-variables to "/usr/lib/debug:/usr/share/gdb/auto-load".
auto-load: Searching 'set auto-load scripts-directory' path "$debugdir:$datadir/auto-load".
auto-load: Attempted file "/usr/share/gdb/auto-load/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.py" exists.
auto-load: Loading python script "/usr/lib/debug/usr/bin/python2.7-gdb.py" by extension for objfile "/usr/lib/debug/usr/bin/python2.7".
2
Mark Plotnick