В gdb есть ли способ получить доступ к содержимому info frame
в скрипте?
Я отлаживаю проблему где-то между Apache, PHP, APC и моим собственным кодом, и у меня есть около ста ядер на выбор. Следуя инструкциям здесь
http://bugs.php.net/bugs-generating-backtrace.php
Я получаю стека трассировки, как:
#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 <b>execute</b> (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 <b>execute</b> (op_array=0xb79d55ec) at /usr/src/debug/php-5.2.7/Zend/zend_vm_execute.h:92
...
#26 0x09caa894 in ?? ()
#27 0x00000000 in ?? ()
Стек всегда будет выглядеть одинаково, функции execute
и ZEND_something
чередуются несколько раз. Мне нужно перейти к последнему экземпляру execute
(up 2
в данном случае) и print myVar
.
Очевидно, что GDB знает имена функций, но отображает ли он их в любых пользовательских переменных, к которым я мог получить доступ?
Ввод frame 2
показывает однострочную версию, а info frame
подробно показывает один стековый кадр. Я хочу сделать что-то вроде
while ($current_frame.function_name != "execute") {up;} print myVar
но я не вижу, как это сделать строго в GDB.
Существует ли переменная / структура / специальная ячейка памяти / что-то, что позволяет получить доступ к информации GDB во всем стеке (например, bt
) или в текущем кадре стека (например, info frame
)?