ฉันจะรับข้อมูลการติดตามของ python โดยใช้ GDB ได้อย่างไร


11

ฉันใช้ GDB เพื่อดีบักข้อผิดพลาดการแบ่งกลุ่มในแอปพลิเคชันหลามของฉันบน Kubuntu 12.04 สมมติว่า GDB เวอร์ชัน 7 มีมาโครในตัวสำหรับดึงข้อมูลเกี่ยวกับ python stack (http://docs.python.org/devguide/gdb.html) แต่ฉันมีปัญหาในการทำให้ใช้งานได้ ฉันติดตั้ง python-dbg แล้ว

เมื่อฉันขอ python stack trace ใน GDB ผลลัพธ์จะเป็นดังนี้:

(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-dbg" แทนที่จะเป็น "python" (พบได้ใน /usr/share/doc/python2.7-dbg/README.debug )


1
แปลกใจที่เรื่องนี้ไม่ได้กล่าวถึงในfedoraproject.org/wiki/Features/EasierPythonDebuggingหรือที่อื่นที่ฉันสามารถหาได้ ขอบคุณลุค
quimnuss

สิ่งนี้ไม่เป็นความจริง คุณเพียงแค่ต้องได้รับสัญลักษณ์การดีบักที่ตรงกับงูหลามที่คุณใช้อยู่ อาจมี gotchas หากจัดการกับ virtualenv เนื่องจาก python นั้นอาจไม่ตรงกับ python ของระบบของคุณ มีการเขียนที่ยอดเยี่ยมที่podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02

6

ใน Ubuntu 16.04 ฉันจัดการเพื่อรับ Python stack trace ใน Python 3.5 โดย:

  1. การติดตั้งpython3-dbgและpython3-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 binary และpy-btทำงานเพื่อแสดง Python stack trace ใน 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)

gdbinit.gz ของฉันบน Ubuntu 16.04 มีคำสั่งจำนวนมากเช่นแต่ไม่มีpystack py-btความคิดใด ๆ ที่เกิดขึ้น?
Anton

ทำไมpython 3.5ถึงติดตั้งไปแล้วpython 3.6?
skytree

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.