Разбирать в середине инструкции с gdb? - PullRequest
0 голосов
/ 09 января 2019

Я считаю, что раньше это работало идеально, но, возможно, я просто забыл правильный синтаксис.

(gdb) disas main
Dump of assembler code for function main:
   0x0000000000001125 <+0>: push   rbp
   0x0000000000001126 <+1>: mov    rbp,rsp
   0x0000000000001129 <+4>: mov    DWORD PTR [rbp-0x4],edi
   0x000000000000112c <+7>: mov    QWORD PTR [rbp-0x10],rsi
   0x0000000000001130 <+11>:    mov    eax,0x0
   0x0000000000001135 <+16>:    pop    rbp
   0x0000000000001136 <+17>:    ret    

Теперь я хочу разобрать на 0x0000000000001127, что составляет 1 байт в первой инструкции mov:

(gdb) disas 0x0000000000001127
Dump of assembler code for function main:
   0x0000000000001125 <+0>: push   rbp
   0x0000000000001126 <+1>: mov    rbp,rsp
   0x0000000000001129 <+4>: mov    DWORD PTR [rbp-0x4],edi
   0x000000000000112c <+7>: mov    QWORD PTR [rbp-0x10],rsi
   0x0000000000001130 <+11>:    mov    eax,0x0
   0x0000000000001135 <+16>:    pop    rbp
   0x0000000000001136 <+17>:    ret    

Он все еще начинает разборку в верхней части главного.

Я также пробовал такие вещи, как main + 1, disas / r и т. Д. Изменилось ли поведение GDB как-то? Я подумал, что, возможно, это связано с тем, что это бинарный файл PIE, но когда я перекомпилирую его с -no-pie, у меня все еще остается проблема из-за чего-то такого простого.

Какой правильный синтаксис?

1 Ответ

0 голосов
/ 09 января 2019

Он все еще начинает разборку в верхней части главного.

Когда вы даете disas единственный аргумент, он находит включающую функцию и разбирает эту всю функцию. Это было поведение с тех пор навсегда.

Если вместо этого вы дадите disas два аргумента, он будет разбирать только данный диапазон:

(gdb) disas &main
Dump of assembler code for function main:
   0x00000000000005fa <+0>: push   %rbp
   0x00000000000005fb <+1>: mov    %rsp,%rbp
   0x00000000000005fe <+4>: mov    $0x0,%eax
   0x0000000000000603 <+9>: pop    %rbp
   0x0000000000000604 <+10>:    retq   
End of assembler dump.

(gdb) disas &main+3,&main+11
Dump of assembler code from 0x5fd to 0x605:
   0x00000000000005fd <main+3>: in     $0xb8,%eax
   0x00000000000005ff <main+5>: add    %al,(%rax)
   0x0000000000000601 <main+7>: add    %al,(%rax)
   0x0000000000000603 <main+9>: pop    %rbp
   0x0000000000000604 <main+10>:    retq   
End of assembler dump.

Вы также можете использовать x/i:

(gdb) x/4i &main+3
   0x5fd <main+3>:  in     $0xb8,%eax
   0x5ff <main+5>:  add    %al,(%rax)
   0x601 <main+7>:  add    %al,(%rax)
   0x603 <main+9>:  pop    %rbp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...