Непоследовательные деструкторы, как видно GDB и ObjdumpC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Непоследовательные деструкторы, как видно GDB и Objdump

Сообщение Anonymous »

Мой код: < /p>
#include
#include
#include

class Base
{
public:
Base(uint32_t len)
: len_(len)
{
buf_ = (char *)malloc(len_ * sizeof(char));
}
virtual ~Base()
{
if (nullptr != buf_)
{
free(buf_);
buf_ = nullptr;
}
}
void set_buf(const char *str)
{
if (nullptr != str && nullptr != buf_ && len_ > 0)
{
strncpy(buf_, str, len_);
buf_[len_ - 1] = '\0';
}
}

private:
uint32_t len_;
char *buf_;
};

int main(int argc, char *argv[])
{
Base base(8);
base.set_buf("hello");
return 0;
}
< /code>
i скомпилировал его, используя g ++ -g -o0 -fno -inline -std = c ++ 11 -wall main.cpp -o main < /code>.

Далее я использовал objdump -s main < /code>, чтобы посмотреть на код сборки: < /p>
0000000000001250 :
virtual ~Base()
1250: f3 0f 1e fa endbr64
1254: 55 push %rbp
1255: 48 89 fd mov %rdi,%rbp
}
1258: e8 d3 ff ff ff call 1230

Как показано выше, вы можете увидеть, что _zn4based0ev (т.е. удаление деструктора) _zn4based1ev (т.е. полное разрушение объекта).

Однако, когда я отлаживаю основное с GDB, я вижу, что _zn4bed0ev Code a Dangug с gdb, я вижу, что _zn4bed0ev Codegaug. _Zn4based2ev (т.е. деструктор базового объекта) и, действительно, это _zn4based2ev в vtable, а не _zn4based1ev .
(gdb) disassemble _ZN4BaseD0Ev
Dump of assembler code for function _ZN4BaseD0Ev:
0x0000555555555250 : endbr64
0x0000555555555254 : push %rbp
0x0000555555555255 : mov %rdi,%rbp
0x0000555555555258 : call 0x555555555230
0x000055555555525d : mov %rbp,%rdi
0x0000555555555260 : mov $0x18,%esi
0x0000555555555265 : pop %rbp
0x0000555555555266 : jmp 0x5555555550a0
End of assembler dump.
< /code>
(gdb) x/4ag 0x555555557d78 - 16
0x555555557d68 : 0x0 0x555555557d88
0x555555557d78 : 0x555555555230 0x555555555250
< /code>
I'd like to know what causes this discrepancy and what the real situation is (does _ZN4BaseD0Ev на самом деле вызов _zn4based1ev или _zn4based2ev )?

my Environment info:
$ uname -a
Linux xxx 5.15.0-127-generic #137-Ubuntu SMP Fri Nov 8 15:21:01 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
$ gdb --version
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1


Подробнее здесь: https://stackoverflow.com/questions/795 ... nd-objdump
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Objdump — как создать исходный код для библиотечных функций на выходе сборки
    Anonymous » » в форуме C++
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Pyelftools: извлекает флаги разделов, как это делает objdump для двоичного файла elf32-littlearm
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Символ не обнаруживается Objdump
    Anonymous » » в форуме Linux
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Понимание вывода Linux objdump - .plt и .plt.sec разделы
    Anonymous » » в форуме Linux
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Распечатать аргументы, которые были переданы в GDB изнутри GDB?
    Anonymous » » в форуме Linux
    0 Ответы
    119 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»