Làm cách nào tôi có thể lấy thông tin theo dõi ngăn xếp python bằng GDB?


11

Tôi đang sử dụng GDB để gỡ lỗi một lỗi phân đoạn trong ứng dụng python của tôi trên Kubfox 12.04. Giả sử GDB phiên bản 7 có các macro tích hợp để trích xuất thông tin về ngăn xếp python (http://docs.python.org/devguide/gdb.html), nhưng tôi gặp sự cố khi làm cho nó hoạt động. Tôi đã cài đặt python-dbg.

Khi tôi yêu cầu theo dõi ngăn xếp python trong GDB, kết quả sẽ như sau:

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

Phiên bản GDB của tôi là 7.4-2012.04-0ubfox2, Python là 2.7.3-0ubfox3.

Câu trả lời:


16

Đây là vấn đề: để có quyền truy cập vào các biểu tượng gỡ lỗi trong GDB, bạn phải gọi một nhị phân khác: "python-dbg" thay vì "python" (tìm thấy trong /usr/share/doc/python2.7-dbg/README.debug ).


1
Đáng ngạc nhiên là làm thế nào điều này không được đề cập trong fedoraproject.org/wiki/Features/EasierPythonDebugging hoặc bất cứ nơi nào khác tôi có thể tìm thấy. Cảm ơn Luke.
quimnuss

Điều này không đúng. Bạn chỉ cần lấy các biểu tượng gỡ lỗi phù hợp với con trăn bạn đang sử dụng. Có thể có vấn đề nếu giao dịch với virtualenv vì con trăn đó có thể không khớp với con trăn trong hệ thống của bạn. Có một bài viết tuyệt vời tại podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02

6

Trên Ubuntu 16.04, tôi đã quản lý để có được dấu vết ngăn xếp Python trong Python 3.5 bằng cách:

  1. Cài đặt python3-dbgpython3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbggói đi kèm với tài liệu ngắn về cách sử dụng nó trong /usr/share/doc/python3-dbg/README.debugđó tôi sẽ sử dụng trong bước tiếp theo.

  2. Áp dụng tập lệnh trợ giúp GDB đã giải nén /usr/share/doc/python3.5/gdbinit.gzvào ~/.gdbinit:

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

Bây giờ gdb sẽ có thể tìm thấy các biểu tượng cho nhị phân Python và py-bthoạt động để hiển thị theo dõi ngăn xếp Python trong 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 của tôi trên Ubuntu 16.04 chứa nhiều lệnh như thế pystacknhưng không có py-bt. Có ai biết cái gì đang xảy ra không?
Anton

Tại sao python 3.5mặc dù tôi đã cài đặt python 3.6?
skytree

0

Có lẽ điều này giúp được ai đó: Nhị phân được đặt tên python2.7-dbgtrên hệ thống Debian của tôi, đến từ python2.7-dbggói. Tôi cũng đã cài đặt python2.7-devgói và apt-get source python2.7-dbgđể gdbcó thể tìm thấy các tệp nguồn cho trình thông dịch Python.

Với tất cả những thứ này, tôi đã tìm cách gỡ lỗi mà SIGSEGVtôi đang chạy vào: https://bugs.python.org/su34870

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.