Bagaimana saya bisa mendapatkan informasi jejak tumpukan python menggunakan GDB?

11

Saya menggunakan GDB untuk men-debug kesalahan segmentasi dalam aplikasi python saya di Kubuntu 12.04. Seharusnya GDB versi 7 memiliki makro built-in untuk mengekstraksi informasi tentang tumpukan python (http://docs.python.org/devguide/gdb.html), tetapi saya mengalami kesulitan untuk membuatnya berfungsi. Saya telah menginstal python-dbg.

Ketika saya meminta jejak tumpukan python di GDB, hasilnya terlihat seperti ini:

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

Versi GDB saya adalah 7.4-2012.04-0ubuntu2, Python adalah 2.7.3-0ubuntu3.

Luke
sumber

Jawaban:

16

Inilah masalahnya: untuk memiliki akses ke simbol debugging di GDB, Anda harus memanggil biner yang berbeda: "python-dbg" bukannya "python" (ditemukan di /usr/share/doc/python2.7-dbg/README.debug ).

Luke
sumber
1
Mengherankan bagaimana ini tidak disebutkan dalam fedoraproject.org/wiki/Features/EasierPythonDebugging atau di mana pun saya bisa menemukan. Terima kasih Luke.
quimnuss
Ini tidak benar. Anda hanya perlu mendapatkan simbol debug yang cocok dengan python yang Anda gunakan. Mungkin ada gotcha jika berurusan dengan virtualenv karena python itu mungkin tidak cocok dengan python sistem Anda. Ada artikel bagus di podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02
6

Di Ubuntu 16.04 saya berhasil mendapatkan jejak tumpukan Python di Python 3.5 dengan:

  1. Menginstal python3-dbgdan python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgpaket disertai dengan dokumentasi singkat cara menggunakannya di /usr/share/doc/python3-dbg/README.debugmana saya akan gunakan pada langkah berikutnya.

  2. Menambahkan skrip pembantu GDB yang belum dibongkar /usr/share/doc/python3.5/gdbinit.gzke ~/.gdbinit:

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

Sekarang gdb akan dapat menemukan simbol untuk biner Python dan py-btberfungsi untuk menampilkan jejak tumpukan Python di gdb:

$ 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)
rutsky
sumber
my gdbinit.gz di Ubuntu 16.04 berisi banyak perintah seperti pystacktetapi tidak ada py-bt. Adakah yang tahu apa yang terjadi?
Anton
Mengapa python 3.5saya sudah menginstalnya python 3.6?
skytree
0

Mungkin ini membantu seseorang: Biner tersebut dinamai python2.7-dbgdi sistem Debian saya, berasal dari python2.7-dbgpaket. Saya juga menginstal python2.7-devpaket dan apt-get source python2.7-dbg, sehingga gdbdapat menemukan file sumber ke juru bahasa Python.

Dengan semua ini di tempat, saya berhasil men-debug SIGSEGVsaya berlari ke: https://bugs.python.org/issue34870

Per Lundberg
sumber