I am trying to use addr2line command in Unix but everytime it is giving the same output as ??:0. I am giving command as addr2line -e a.out 0x4005BDC
. I got this address while running this a.out executable with valgrind
tool to find the memory leakage. I also compiled the source code with -g
option.

- 347,512
- 102
- 1,199
- 985

- 979
- 3
- 12
- 17
4 Answers
You can also use gdb instead of addr2line to examine memory address. Load executable file in gdb and print the name of a symbol which is stored at the address. 16 Examining the Symbol Table.
(gdb) info symbol 0x4005BDC

- 33,961
- 14
- 109
- 164
-
1Good idea. Also running the program in gdb with a breakpoint at that address and getting the backtrace could give good information about what exactly is happening there. – Mat Oct 04 '11 at 14:08
-
9See also (gdb) info line * 0x4005BDC – user47559 Oct 04 '11 at 15:01
-
1The (library) code address would be the same or different, between compiling with "-g" flag and without the flag ? – WindChaser Mar 18 '16 at 22:27
You need to specify an offset to addr2line, not a virtual address (VA). Presumably if you had address space randomization turned off, you could use a full VA, but in most modern OSes, address spaces are randomized for a new process.
Given the VA 0x4005BDC
by valgrind, find the base address of your process or library in memory. Do this by examining the /proc/<PID>/maps
file while your program is running. The line of interest is the text
segment of your process, which is identifiable by the permissions r-xp
and the name of your program or library.
Let's say that the base VA is 0x0x4005000
. Then you would find the difference between the valgrind supplied VA and the base VA: 0xbdc
. Then, supply that to add2line:
addr2line -e a.out -j .text 0xbdc
And see if that gets you your line number.

- 3,389
- 2
- 21
- 29
-
2wait, what offsets ? Isn't addr2line just takes addresses from symtab (or dyntab) ? – Alexander Malakhov Mar 13 '13 at 10:59
That's exactly how you use it. There is a possibility that the address you have does not correspond to something directly in your source code though.
For example:
$ cat t.c
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
$ gcc -g t.c
$ addr2line -e a.out 0x400534
/tmp/t.c:3
$ addr2line -e a.out 0x400550
??:0
0x400534
is the address of main
in my case. 0x400408
is also a valid function address in a.out
, but it's a piece of code generated/imported by GCC, that has no debug info. (In this case, __libc_csu_init
. You can see the layout of your executable with readelf -a your_exe
.)
Other times when addr2line
will fail is if you're including a library that has no debug information.

- 202,337
- 40
- 393
- 406
-
In my code I am using pthread and libconfing library. I don't know these libraries has debug info or not. – Prak Oct 04 '11 at 15:41
Try adding the -f
option to show the function names :
addr2line -f -e a.out 0x4005BDC

- 34,748
- 11
- 69
- 112

- 13,286
- 5
- 31
- 40