GDB를 사용하여 파이썬 스택 추적 정보를 얻는 방법은 무엇입니까?


11

Kubuntu 12.04의 Python 응용 프로그램에서 GDB를 사용하여 분할 오류를 디버깅하고 있습니다. 아마도 GDB 버전 7에는 파이썬 스택 (http://docs.python.org/devguide/gdb.html)에 대한 정보를 추출하기위한 매크로가 내장되어 있지만 작동시키지 못했습니다. python-dbg를 설치했습니다.

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"대신 "python-dbg"라는 다른 바이너리를 호출해야합니다 (/usr/share/doc/python2.7-dbg/README.debug에 있음). ).


1
fedoraproject.org/wiki/Features/EasierPythonDebugging 또는 다른 곳 에서 언급되지 않은 방법에 대해 놀랍습니다 . 고마워 루크
quimnuss

사실이 아닙니다. 사용중인 파이썬과 일치하는 디버깅 기호를 가져와야합니다. 파이썬이 시스템의 파이썬과 일치하지 않을 수 있으므로 virtualenv를 처리하는 경우 문제가 발생할 수 있습니다. 에서 좋은 작성자가 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. 무슨 일이야?
Anton

python 3.5이미 설치했는데 왜 그렇 python 3.6습니까?
skytree

0

어쩌면 이것은 누군가를 도울 수 있습니다 : 바이너리는 패키지 python2.7-dbg에서 나온 데비안 시스템에서 이름이 지정 python2.7-dbg됩니다. 나는 또한 설치 python2.7-dev패키지를하고 apt-get source python2.7-dbg그 때문에, gdb파이썬 인터프리터 소스 파일을 찾을 수 있습니다.

이 모든 것을 갖추어 SIGSEGV내가 실행중인 디버깅을 https://bugs.python.org/issue34870

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.