Получение имен аргументов функций в GDB без попадания в точку останова - PullRequest
1 голос
/ 08 мая 2020

Я использую GDB mingw.

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

Breakpoint 1, CApp::OnTextInput (this=0x81ab888, ch=97)

Однако я не могу найти способ получить имена аргументов для функций, для которых я не установил точку останова. С помощью info functions я могу получать типы аргументов и имена функций, но не имена аргументов.

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

1 Ответ

0 голосов
/ 09 мая 2020

Я не смог найти, как это сделать с помощью gdb, но вы можете сделать это другими инструментами: dwarfdump или objdump. Для этой простой программы:

int main(int argc, char * argv[])
{
  return 0;
}

вы можете сбросить отладочную информацию dwarf с помощью dwarfdump:

$ dwarfdump a.out | grep -A30 "DW_AT_name.*main"
                      DW_AT_name                  main
                      DW_AT_decl_file             0x00000001 /tmp/1.c
                      DW_AT_decl_line             0x00000001
                      DW_AT_decl_column           0x00000005
                      DW_AT_prototyped            yes(1)
                      DW_AT_type                  <0x0000006e>
                      DW_AT_low_pc                0x00401106
                      DW_AT_high_pc               <offset-from-lowpc>18
                      DW_AT_frame_base            len 0x0001: 9c: DW_OP_call_frame_cfa
                      DW_AT_GNU_all_call_sites    yes(1)
                      DW_AT_sibling               <0x0000006e>
< 2><0x0000004f>      DW_TAG_formal_parameter
                        DW_AT_name                  argc
                        DW_AT_decl_file             0x00000001 /tmp/1.c
                        DW_AT_decl_line             0x00000001
                        DW_AT_decl_column           0x0000000e
                        DW_AT_type                  <0x0000006e>
                        DW_AT_location              len 0x0002: 916c: DW_OP_fbreg -20
< 2><0x0000005e>      DW_TAG_formal_parameter
                        DW_AT_name                  argv
                        DW_AT_decl_file             0x00000001 /tmp/1.c
                        DW_AT_decl_line             0x00000001
                        DW_AT_decl_column           0x0000001b
                        DW_AT_type                  <0x00000075>
                        DW_AT_location              len 0x0002: 9160: DW_OP_fbreg -32
< 1><0x0000006e>    DW_TAG_base_type
                      DW_AT_byte_size             0x00000004
                      DW_AT_encoding              DW_ATE_signed
                      DW_AT_name                  int
< 1><0x00000075>    DW_TAG_pointer_type
                      DW_AT_byte_size             0x00000008

Здесь вы можете увидеть, что функция main имеет 2 параметра с именами argc и argv.

Вы также можете использовать objdump для получения той же информации. Вот соответствующий вывод для main и его параметры из вывода objdump --dwarf=info a.out:

 <1><2d>: Abbrev Number: 2 (DW_TAG_subprogram)
    <2e>   DW_AT_external    : 1
    <2e>   DW_AT_name        : (indirect string, offset: 0x58): main
    <32>   DW_AT_decl_file   : 1
    <33>   DW_AT_decl_line   : 1
    <34>   DW_AT_decl_column : 5
    <35>   DW_AT_prototyped  : 1
    <35>   DW_AT_type        : <0x6e>
    <39>   DW_AT_low_pc      : 0x401106
    <41>   DW_AT_high_pc     : 0x12
    <49>   DW_AT_frame_base  : 1 byte block: 9c     (DW_OP_call_frame_cfa)
    <4b>   DW_AT_GNU_all_call_sites: 1
    <4b>   DW_AT_sibling     : <0x6e>
 <2><4f>: Abbrev Number: 3 (DW_TAG_formal_parameter)
    <50>   DW_AT_name        : (indirect string, offset: 0x5): argc
    <54>   DW_AT_decl_file   : 1
    <55>   DW_AT_decl_line   : 1
    <56>   DW_AT_decl_column : 14
    <57>   DW_AT_type        : <0x6e>
    <5b>   DW_AT_location    : 2 byte block: 91 6c  (DW_OP_fbreg: -20)
 <2><5e>: Abbrev Number: 3 (DW_TAG_formal_parameter)
    <5f>   DW_AT_name        : (indirect string, offset: 0x0): argv
    <63>   DW_AT_decl_file   : 1
    <64>   DW_AT_decl_line   : 1
    <65>   DW_AT_decl_column : 27
    <66>   DW_AT_type        : <0x75>
    <6a>   DW_AT_location    : 2 byte block: 91 60  (DW_OP_fbreg: -32)
 <2><6d>: Abbrev Number: 0
...