Как демонтировать диапазон памяти с GDB?

В целом Вы реализуете интерфейс ICloneable и реализуете, Клонируют себя. Объекты C# имеют встроенный метод MemberwiseClone, который выполняет мелкую копию, которая может выручить Вас для всех примитивов.

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

58
задан Ciro Santilli 新疆改造中心法轮功六四事件 26 July 2018 в 15:21
поделиться

6 ответов

Вы хотите только разобрать свой фактический главный? Если да, попробуйте следующее:

(gdb) info line main 
(gdb) disas STARTADDRESS ENDADDRESS

Примерно так:

USER@MACHINE /cygdrive/c/prog/dsa
$ gcc-3.exe -g main.c

USER@MACHINE /cygdrive/c/prog/dsa
$ gdb a.exe
GNU gdb 6.8.0.20080328-cvs (cygwin-special)
...
(gdb) info line main
Line 3 of "main.c" starts at address 0x401050 <main> and ends at 0x401075 <main+
(gdb) disas 0x401050 0x401075
Dump of assembler code from 0x401050 to 0x401075:
0x00401050 <main+0>:    push   %ebp
0x00401051 <main+1>:    mov    %esp,%ebp
0x00401053 <main+3>:    sub    $0x18,%esp
0x00401056 <main+6>:    and    $0xfffffff0,%esp
0x00401059 <main+9>:    mov    $0x0,%eax
0x0040105e <main+14>:   add    $0xf,%eax
0x00401061 <main+17>:   add    $0xf,%eax
0x00401064 <main+20>:   shr    $0x4,%eax
0x00401067 <main+23>:   shl    $0x4,%eax
0x0040106a <main+26>:   mov    %eax,-0xc(%ebp)
0x0040106d <main+29>:   mov    -0xc(%ebp),%eax
0x00401070 <main+32>:   call   0x4010c4 <_alloca>
End of assembler dump.

Однако я не вижу вашего системного вызова прерывания. (прошло некоторое время с тех пор, как я в последний раз пытался выполнить системный вызов на ассемблере. INT 21h, последнее, что я помню

45
ответ дан 24 November 2019 в 18:39
поделиться

Это не прямой ответ на ваш вопрос, но поскольку вы, кажется, просто хотите дизассемблировать двоичный файл, возможно, вы могли бы просто использовать objdump :

objdump -d program

Это должен дать вам его разборку. Вы можете добавить -S , если хотите, чтобы источник был аннотирован.

30
ответ дан 24 November 2019 в 18:39
поделиться

Вы можете заставить gcc выводить непосредственно в ассемблерный код, добавив переключатель -S

gcc -S hello.c
6
ответ дан 24 November 2019 в 18:39
поделиться

Да, дизассемблировать здесь не лучшая команда. Вам нужна команда «x / i» (изучите как инструкции):

(gdb) x/i 0xdeadbeef
97
ответ дан 24 November 2019 в 18:39
поделиться

Если все, что вам нужно, это увидеть разборку с вызовом INTC, используйте objdump -d, как уже упоминалось, но используйте параметр -static при компиляции. В противном случае функция fopen не компилируется в elf и связывается во время выполнения.

3
ответ дан 24 November 2019 в 18:39
поделиться

fopen() является библиотечной функцией Си и поэтому вы не увидите в своем коде никаких команд syscall, просто обычный вызов функции. В какой-то момент она действительно вызывает open(2), но делает это через батут. Просто происходит переход на страницу VDSO, которая предоставляется ядром каждому процессу. Затем VDSO предоставляет код для выполнения системного вызова. На современных процессорах будут использоваться инструкции SYSCALL или SYSENTER, но вы также можете использовать INT 80h на процессорах x86.

7
ответ дан 24 November 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: