Dans gdb, existe-t-il un moyen d'accéder au contenu de info frame
dans un script? Je suis en train de déboguer un problème quelque part entre Apache, PHP, APC et mon propre code, et j'ai à peu près une centaine de cœurs à choisir. En suivant les instructions ici http://bugs.php.net/bugs-generating-backtrace.php je me retrouve avec un stacktrace comme:Accès aux informations de cadre dans gdb
#0 0x0121a31a in do_bind_function (opline=0xa94dd750, function_table=0x9b9cf98, compile_time=0 '\0') at /usr/src/debug/php-5.2.7/Zend/zend_compile.c:2407 #1 0x0124bb2e in ZEND_DECLARE_FUNCTION_SPEC_HANDLER (execute_data=0xbfef7990) at /usr/src/debug/php-5.2.7/Zend/zend_vm_execute.h:498 #2 0x01249dfa in execute (op_array=0xb79d5d3c) at /usr/src/debug/php-5.2.7/Zend/zend_vm_execute.h:92 #3 0x01261e31 in ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER (execute_data=0xbfef80d0) at /usr/src/debug/php-5.2.7/Zend/zend_vm_execute.h:7809 #4 0x01249dfa in execute (op_array=0xb79d55ec) at /usr/src/debug/php-5.2.7/Zend/zend_vm_execute.h:92 ... #26 0x09caa894 in ??() #27 0x00000000 in ??()
La pile regardera toujours la même, avec la fonction execute
et ZEND_something
entrelacée à plusieurs reprises. Je dois aller jusqu'à la dernière instance de execute
(up 2
dans ce cas) et print myVar
.
De toute évidence, gdb connaît les noms des fonctions, mais les fait-il apparaître dans toutes les variables utilisateur auxquelles j'aurais accès?
La saisie frame 2
montre une version d'une ligne, et info frame
montre une seule structure de pile en détail. Je veux faire quelque chose comme while ($current_frame.function_name != "execute") {up;} print myVar
mais je ne vois pas comment le faire strictement dans gdb. Y at-il une variable/structure/emplacement de mémoire spécial/quelque chose qui permet d'accéder aux informations de gdb sur la pile entière (comme bt
) ou sur la trame de pile actuelle (comme info frame
)?
On dirait que c'est le seul moyen sans utiliser quelque chose de fou comme attendre et écrire des tas de trucs bizarres. – Maelstrom