При анализе ядра, сбрасываемого после SIGABRT, gdb говорит, что моя последняя строка кода, выполняемая (перед вводом кода библиотеки), является назначением указателю char
, поскольку показано ниже:Сигнал 6 (SIGABRT) при назначении переменной null (C++)
GDB:
(gdb) bt full
#0 0x006337a2 in _dl_sysinfo_int80() from /lib/ld-linux.so.2
No symbol table info available.
#1 0x00674815 in raise() from /lib/tls/libc.so.6
No symbol table info available.
#2 0x00676279 in abort() from /lib/tls/libc.so.6
No symbol table info available.
#3 0x006a8cca in __libc_message() from /lib/tls/libc.so.6
No symbol table info available.
#4 0x006af55f in _int_free() from /lib/tls/libc.so.6
No symbol table info available.
#5 0x006af93a in free() from /lib/tls/libc.so.6
No symbol table info available.
#6 0x00d0b14e in __builtin_delete() from /usr/lib/libstdc++-libc6.1-1.so.2
No symbol table info available.
#7 0x0808181c in MyObject::~MyObject (this=0x84f4db0, __in_chrg=3) at ./MyObject.cpp:16
this = (MyObject *) 0x84f4db0
myobject.cpp: 16 листинг:
12: ...
13: MyObject::~MyObject() {
14: if (this->string != NULL) {
15: delete this->string;
16: this->string = NULL;
17: }
18: }
19: ...
Прежде всего, я не понимаю, почему линия 16 Wou ld приводит к тому, что стек вызовов. Было бы разумнее, если бы это было результатом выполнения строки 15, той, которая была с оператором delete
(если только «строка 16» не представляет код, выполняемый после код деструктора для освобождения выделенной для этого объекта памяти, просто угадывая здесь).
Помимо этого, может ли кто-нибудь указать способ правильно отладить это ядро?
Это результат строки 15. – UmNyobe
Заметим, что 1) нулевая проверка является излишней, так как удаление делает это тоже, и 2) присвоение нулевого значения также излишне, поскольку объект не существует после завершения dtor. Кроме этого, вы можете создать тестовый файл? и, пожалуйста, опубликуйте хотя бы сообщение об ошибке, которое выдается glibc прямо перед прерыванием. Мое лучшее предположение, что вы хотели 'delete []' вместо 'delete'. – PlasmaHH
К сожалению, я не могу создать тестовый файл менее чем за один месяц (код действительно большой и объединенный). 'this-> string' имеет тип' char * '. У меня нет сообщения об ошибке, выпущенного glibc. Это вся информация, которую я имею/могу поделиться. – freitass