gdb - печатать имена макросов вместо значений - PullRequest
0 голосов
/ 02 апреля 2019

Можно ли разворачивать макросы в gdb?

Я скомпилировал двоичный файл с -g3, и я вижу определения макросов:

(gdb) info macro  NGX_CORE_MODULE
Defined at /path/src/core/ngx_conf_file.h:70
  included at /path/src/core/ngx_core.h:86
  included at /path/src/core/ngx_cycle.c:9
#define NGX_CORE_MODULE 0x45524F43
(gdb) 

, но когда я вижу переменную, я вижу числовое значение вместо имени макроса

(gdb) p/x cycle->modules[0]->type
$17 = 0x45524f43
(gdb) 

возможно ли получить что-то вроде этого:

(gdb) p cycle->modules[0]->type
$17 = NGX_CORE_MODULE
(gdb) 

Я пробовал пользовательскую функцию, подобную этой:

define expand_module_type_macro
if $arg0 == 0x45524F43
   print "NGX_CORE_MODULE"
else 
if $arg0 == 0x464E4F43
   print "NGX_CONF_MODULE"
else
   print $arg0
end
end
end

и он работает

(gdb) expand_module_type_macro cycle->modules[0]->type
$18 = "NGX_CORE_MODULE"
(gdb) 

но он не имеет практического применения, потому что я не могу использовать его со сложным выводом:

(gdb) printf "module type=%s\n", expand_module_type_macro cycle->modules[0]->type
No symbol "expand_module_type_macro" in current context.
(gdb) set $m = expand_module_type_macro cycle->modules[0]->type
No symbol "expand_module_type_macro" in current context.
(gdb) 

1 Ответ

0 голосов
/ 08 апреля 2019

Вы можете получить что-то полезное, создав удобную функцию в python. Я тестировал с помощью этой программы на C:

int var1 = 1234;
int var2 = 4567;

int
main ()
{
  return 0;
}

И используя этот скрипт Python:

class ExpandMacro (gdb.Function):
    """Expand a value to a string, replacing with
    macro name where possible."""

    def __init__ (self):
        super (ExpandMacro, self).__init__ ("expand")

    def invoke (self, value):
        if (value == 1234):
            return "MY_MACRO"
        else:
            return str (value)

ExpandMacro ()

Тогда мой сеанс GDB:

(gdb) start
# .... snip ....
7     return 0;
(gdb) source lookup.py 
(gdb) p $expand (var1)
$1 = "MY_MACRO"
(gdb) p $expand (var2)
$2 = "4567"
(gdb) printf "var1=%s\n", $expand (var1)
var1=MY_MACRO
(gdb) printf "var2=%s\n", $expand (var2)
var2=4567

Чтобы использовать возвращаемое значение в формате %s внутри printf, я всегда возвращаю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...