Hello, I writing a better pass (variable tracking) for GCC which finally emits location lists for variables. (If you are insterested it is at http://artax.karlin.mff.cuni.cz/~zlomj9am/download/vt-main.patch It still contains many debugging checks and (disabled) prints.) Let the local variables and (some) arguments be addressed using stack pointer, for example x86-64 architecture with variables addressed using %rsp. The address emitted for variables located on stack by my new patch is always DW_OP_fbreg + constant. When I was testing the emitted debug info with mainline GDB I found that GDB probably does not adjust addresses of variables when stack pointer changes (like because of "pushq" instruction) if using location lists. I think GDB should adjust the address of %rsp addressed variables according to change of %rsp (probably DWARF2 sais so for DW_OP_fbreg). I think it is a better solution than emitting new locations to location list for all variables located on stack after each "push" and "pop" which would cause too large debug info. When I looked to gdb/dwarf2loc.c I see there: /* FIXME: cagney/2003-03-26: This code should be using get_frame_base_address(), and then implement a dwarf2 specific this_base method. */ Probably this is related to my problem. I tested it on attached C file, assembler with debug info and x86-64 binary is attached too. GDB's output: # g is the first argument on stack, the first 6 arguments are in registers Breakpoint 1, func1 (a=10, b=20, c=30, d=40, e=50, f=60, g=70, seq=0) at m.c:5 5 { 2: x/i $pc 0x400400 : push %r12 1: g = 70 (gdb) ni 0x0000000000400402 5 { 2: x/i $pc 0x400402 : mov %rcx,%r12 # here it looks GDB did not recompute address 1: g = 4195497 (gdb) 0x0000000000400405 5 { 2: x/i $pc 0x400405 : mov %r8,%rcx 1: g = 4195497 (gdb) 0x0000000000400408 5 { 2: x/i $pc 0x400408 : mov %rdx,%r10 1: g = 4195497 (gdb) 0x000000000040040b 5 { 2: x/i $pc 0x40040b : push %rbp 1: g = 4195497 (gdb) 0x000000000040040c 5 { 2: x/i $pc 0x40040c : mov %rdi,%rbp 1: g = 4195520 (gdb) 0x000000000040040f 5 { 2: x/i $pc 0x40040f : push %rbx 1: g = 4195520 (gdb) 0x0000000000400410 5 { 2: x/i $pc 0x400410 : mov 0x20(%rsp,1),%r8 1: g = 548682067112 # here g was loaded from stack to %r8 (gdb) 0x0000000000400415 5 { 2: x/i $pc 0x400415 : mov %rsi,%rbx 1: g = 70 (gdb) Josef