Мой код: < /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
Непоследовательные деструкторы, как видно GDB и Objdump ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1742068970
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79511682/inconsistent-destructors-as-seen-by-gdb-and-objdump[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия