web-dev-qa-db-fra.com

Impossible d'activer py-bt pour gdb

J'ai téléchargé et compilé Python 3.5 sur une machine CentOS 6.5. Cela fonctionne sans problème. Le problème est que je dois utiliser gdb pour déboguer un bogue subtil impliquant une surutilisation du processeur pendant ma python exécution du programme.

D'après la documentation officielle Python sur extension gdb , ils disent que la seule chose à faire est d'ajouter

add-auto-load-safe-path /path/to/dir/with/python-gdb.py

à ~/.gdbinit. Je l'ai testé avec

gdb --args /path/to/python3.5/binary
(gdb) py-bt

mais je reçois

Undefined command: "py-bt"

gdb est la version 7.2 et la prise en charge python activée).

14
Marco Sulla

Je l'ai trouvé! Vous devez ajouter /PATH_TO_PYTHON_SRC/Tools/gdb à PYTHONPATH, puis dans gdb vous devriez pouvoir exécuter:

python import libpython

Source: https://sumitkgaur.wordpress.com/2014/05/13/python-debugging/

6
Marco Sulla

Baser sur un article de blog par Débogage des processus CPython avec gdb Une autre façon de résoudre le problème est de source python3.5-gdb.py fichier. Exécutez la commande info auto-load pour vérifier que les fichiers sont chargés (si c'est le cas) et sinon - chargez-les manuellement: source /usr/share/gdb/auto-load/usr/bin/python3.5-gdb.py (! le chemin peut être différent).

Ensuite py-bt devrait marcher!

EDITED: version py modifiée

14
Alex Bender

gdb charge automatiquement les scripts CLI gdb (ou Python ou Scheme) en parcourant les arborescences de répertoires enracinées dans les répertoires de votre chemin de recherche scripts-directory . Pour chaque exécutable ou un objet partagé chargé, gdb recherche les scripts nommés objfile-gdb.gdb (ou objfile-gdb.py ou objfile-gdb.scm).

Une façon de charger automatiquement les extensions gdb pour python est de placer cette python-gdb.py le fichier que vous avez téléchargé se trouve sous l'un des répertoires de votre chemin de répertoire de scripts. Par exemple, le python2.7-dbg le package sur Ubuntu installe ces fichiers:

-rwxr-xr-x /usr/lib/debug/usr/bin/python2.7-gdb.py
lrwxrwxrwx /usr/lib/debug/usr/lib/libpython2.7.so.1.0-gdb.py -> ../bin/python2.7-gdb.py

Voici une session gdb qui montre comment le python2.7-gdb.py le script est automatiquement chargé lorsque je commence à déboguer le /usr/bin/python exécutable:

(gdb) show auto-load scripts-directory
List of directories from which to load auto-loaded scripts is $debugdir:$datadir/auto-load.
(gdb) set debug auto-load
(gdb) file /usr/bin/python
Reading symbols from /usr/bin/python...Reading symbols from /usr/lib/debug//usr/bin/python2.7...done.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Expanded $-variables to "/usr/lib/debug:/usr/share/gdb/auto-load".
auto-load: Searching 'set auto-load scripts-directory' path "$debugdir:$datadir/auto-load".
auto-load: Attempted file "/usr/share/gdb/auto-load/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.py" exists.
auto-load: Loading python script "/usr/lib/debug/usr/bin/python2.7-gdb.py" by extension for objfile "/usr/lib/debug/usr/bin/python2.7".
2
Mark Plotnick