[英]Signal 6 (SIGABRT) when assigning variable to null (C++)
分析SIGABRT之后转储的内核时,gdb表示我执行的最后一行代码(在输入库代码之前)是对char
指针的NULL
赋值,如下所示:
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行会导致该调用堆栈。 如果这是执行第15行的结果,那将更有意义,第15行是带有delete
运算符的结果(除非“第16行”表示在析构函数的代码之后执行的代码,以释放为该对象分配的内存;只是在这里猜测)。
除此之外,还有谁能指出正确调试该内核的方法?
此- this->string
有什么类型? 它是一个char数组吗? 然后,您应该使用delete [] this->string
。 它是指向对象的指针吗? 然后,该对象要么已被删除且指针未为空,要么从未创建过该对象,并且指针被统一了。
实际崩溃发生在此行:
15: delete this->string;
崩溃是由于在__libc_message
内部调用abort
__libc_message
。 最后一个例程向您的标准错误显示了一条消息,该消息看起来像
*** glbc detected: double free or heap corruption at ... ***
使用Valgrind或AddressSanitizer :他们会直接指出问题所在。
我不明白为什么第16行会导致该调用堆栈。
当您查看导致raise
系统调用的调用堆栈时,您需要了解在将控制权转移到被调用的过程之前, CALL
指令将要执行的下一条指令的地址放在堆栈上,而下一条就是GDB在backtrace
向您显示的指令(所有调试器都执行此操作)。 该下一条指令可能在当前行,下一行或向下20行。
它指向下一行即将被执行,这是行16在你的情况下,最后执行的语句/表达线15,并坠毁在该行。
从您的发帖很难分辨出这里有什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.