繁体   English   中英

将变量分配为null时的信号6(SIGABRT)(C ++)

[英]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 ...  ***

使用ValgrindAddressSanitizer :他们会直接指出问题所在。

我不明白为什么第16行会导致该调用堆栈。

当您查看导致raise系统调用的调用堆栈时,您需要了解在将控制权转移到被调用的过程之前, CALL指令将要执行的下一条指令的地址放在堆栈上,而下一条就是GDB在backtrace向您显示的指令(所有调试器都执行此操作)。 该下一条指令可能在当前行,下一行或向下20行。

它指向下一行即将被执行,这是行16在你的情况下,最后执行的语句/表达线15,并坠毁在该行。

从您的发帖很难分辨出这里有什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM