GDBを使用してPythonスタックトレース情報を取得するにはどうすればよいですか?


11

Kubuntu 12.04のpythonアプリケーションでセグメンテーションエラーをデバッグするためにGDBを使用しています。おそらくGDBバージョン7には、Pythonスタック(http://docs.python.org/devguide/gdb.html)に関する情報を抽出するための組み込みマクロがありますが、動作させるのに問題があります。python-dbgをインストールしました。

GDBでPythonスタックトレースを要求すると、結果は次のようになります。

(gdb) py-bt
#5 (unable to read python frame information)
#16 (unable to read python frame information)
#26 (unable to read python frame information)
...

私のGDBバージョンは7.4-2012.04-0ubuntu2、Pythonは2.7.3-0ubuntu3です。

回答:


16

問題は次のとおりです。GDBのデバッグシンボルにアクセスするには、別のバイナリを呼び出す必要があります。「python」ではなく「python-dbg」(/ usr / share / doc / python2.7-dbg / README.debugにあります) )。


1
これがfedoraproject.org/wiki/Features/EasierPythonDebuggingまたは私が見つけることができる他の場所で言及されていないことに驚く。ありがとうルーク。
quimnuss

これは真実ではありません。使用しているpythonに一致するデバッグシンボルを取得する必要があります。virtualenvを扱う場合、Pythonがシステムのpythonと一致しない可能性があるため、問題が発生する可能性があります。podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02に

6

Ubuntu 16.04では、次の方法でPython 3.5でPythonスタックトレースを取得できました。

  1. インストールpython3-dbgpython3-dev

    $ sudo apt install python3-dbg python3-dev

    python3-dbgパッケージには/usr/share/doc/python3-dbg/README.debug、次のステップで使用する短いドキュメントが付属しています。

  2. 解凍されたGDBヘルパースクリプト/usr/share/doc/python3.5/gdbinit.gz~/.gdbinit以下に追加:

    zcat /usr/share/doc/python3.5/gdbinit.gz >> ~/.gdbinit

これで、gdbはPythonバイナリのシンボルを検索できるようになりpy-bt、gdbでPythonスタックトレースを表示できるようになります。

$ gdb -p 4762
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
Attaching to process 4762
[New LWP 4852]
[New LWP 4853]
[New LWP 4854]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f38e43deb5d in poll () at ../sysdeps/unix/syscall-template.S:84
84      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) py-bt
Traceback (most recent call first):
  File "/usr/bin/indicator-cpufreq", line 80, in <module>
    Gtk.main()
(gdb)

Ubuntu 16.04上の私のgdbinit.gzには、次のような多くのコマンドpystackが含まれていますが、ありませんpy-bt。何が起こっているのでしょうか?
アントン

python 3.5すでにインストールしているのになぜpython 3.6ですか?
スカイツリー

0

たぶんこれは誰かを助けます:バイナリはパッケージにpython2.7-dbg由来する私のDebianシステムで命名されていpython2.7-dbgます。また、python2.7-devパッケージとをインストールしたapt-get source python2.7-dbgのでgdb、Pythonインタープリターのソースファイルを見つけることができました。

これがすべて整ったので、SIGSEGV実行していたものをデバッグできました:https : //bugs.python.org/issue34870

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.