Memory failure in "?? ()" using GDB


I'm trying to trace my segmentation fault using gdb and I'm unable to find the exact line where the fault is happening.

(gdb) backtrace
#0  0x00110402 in __kernel_vsyscall ()
#1  0x007a5690 in raise () from /lib/
#2  0x007a6f91 in abort () from /lib/
#3  0x007dd9eb in __libc_message () from /lib/
#4  0x007e59aa in _int_free () from /lib/
#5  0x007e90f0 in free () from /lib/
#6  0x080dc4e7 in CRYPTO_free ()
#7  0x08c36668 in ?? ()
#8  0x08c44bac in ?? ()
#9  0x08100168 in BN_free ()
#10 0x00000009 in ?? ()
#11 0x08c44ba8 in ?? ()
#12 0x08108c07 in BN_MONT_CTX_free ()
#13 0xffffffff in ?? ()
#14 0x08c36630 in ?? ()
#15 0x08112697 in RSA_eay_finish ()
#16 0x08c4c110 in ?? ()
#17 0x08c36630 in ?? ()
#18 0x081150af in RSA_free ()
#19 0xffffffff in ?? ()
#20 0x00000009 in ?? ()
#21 0x0821870d in ?? ()
#22 0x000000dd in ?? ()
#23 0x08c4c110 in ?? ()
#24 0x08c35e98 in ?? ()
#25 0x08136893 in EVP_PKEY_free ()
#26 0xffffffff in ?? ()
#27 0x0000000a in ?? ()
#28 0x08226017 in ?? ()
#29 0x00000189 in ?? ()
#30 0x007e90f0 in free () from /lib/
#31 0x00000000 in ?? ()

How do I get rid of the ?? () and get a more precise solution? Thank you.


3 Answers


First, getting the complete stack trace here will likely not help you: any crash inside free implementation is due to heap corruption. Here we have heap corruption that GLIBC has already detected and told you about on the console.

Knowing where the corrupted block is being freed usually doesn't help to find where the block was corrupted; use specialized tools like Valgrind or AddressSanitizer for that.

Second, you are not getting file/line info because the crash is happening inside, and you have not installed debuginfo symbols for it. How to install debuginfo depends on your Linux distribution, which you have not told us about.

Last, the reason you have an "apparently corrupt" stack with addresses that don't correspond to any symbols is likely that the calls are coming from hand-coded assembly code (from libopenssl.a), which doesn't use frame pointers and doesn't have correct unwind descriptors. GDB needs one or the other to produce correct stack trace.

answered on Stack Overflow May 12, 2015 by Employed Russian

Compile your project with -g -O0 flag. Without -g flag the gcc compiler will strip all the symbol out and that's why you cannot see any symbol. If you want debug 3rd party library then you should configure it with --with-debug or other debug option.

answered on Stack Overflow May 12, 2015 by nobody0day

Yeah it looks like your stack is corrupted. The way I would approach this is to run the program under a memory profiler like valgrind. Watch out for double free, writing arrays out-of-bounds, and conditional jumps.

answered on Stack Overflow May 14, 2015 by narz

User contributions licensed under CC BY-SA 3.0