Как читать информацию о сбое C ++ - PullRequest
3 голосов
/ 25 октября 2011

Привет, я столкнулся с чем-то вроде

*** glibc detected *** /usr/lib/R/bin/exec/R: double free or corruption (out): 0xb1f64430 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6ebc2)[0xb73f3bc2]
/lib/i386-linux-gnu/libc.so.6(+0x6f862)[0xb73f4862]
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xb73f794d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb684680f]
XXX.so(_XXXDXEv+0x30)[0xb66fab00]
...
/usr/local/lib/libboost_thread.so.1.46.1(thread_proxy+0x69)[0xb694a3a9]
/lib/i386-linux-gnu/libpthread.so.0(+0x6d31)[0xb7508d31]
/lib/i386-linux-gnu/libc.so.6(clone+0x5e)[0xb74570ce]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:05 11536433   /usr/lib/R/bin/exec/R
08049000-0804a000 r--p 00000000 08:05 11536433   /usr/lib/R/bin/exec/R
0804a000-0804b000 rw-p 00001000 08:05 11536433   /usr/lib/R/bin/exec/R
09c38000-0a885000 rw-p 00000000 00:00 0          [heap]
b1a00000-b1aae000 rw-p 00000000 00:00 0 
...

Мне просто интересно ... что это за XXX, в конце моих собственных методов, что такое DxEv? У всех моих собственных методов есть D0Ev, D1Ev или D2Ev? Это имеет какое-то значение?

А как насчет 0x30 потом? Это количество байтов в моем классе? Или адрес функции? Могу ли я решить это как-нибудь?

Спасибо

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

_XXXDXEv - это искаженное имя функции - используйте c++filt для его разборки.

(_XXXDXEv+0x30) означает, что уровень возврата был 48 байтов в коде этой функции.

Попробуйте перезапустить под GDB, или запустите GDB над основным файлом, если он у вас есть, для более подробной информации.

2 голосов
/ 25 октября 2011

Это так называемое искаженное имя (то есть оформленное компилятором с типом аргумента и возвращаемого значения). Вы можете использовать утилиту c++filt для возврата подписи функции. 0x30 - это смещение в потоке кода функции от начала в байтах.

...