Files
valgrind/gdbserver_tests/hgtls.stdinB.gdb
Philippe Waroquiers bc353dfe97 fix 338160: Implement QGetTlsAddr query so that GDB+V gdbsrv can print __thread variables.
To implement QGetTlsAddr, gdbsrv has to know how to get the glibc dtv
address and the module id from the link_map.
These 2 things are dependent on the internals of glibc.
The dependency is mostly isolated in a few lines of arch dependent
code or in an external utility that used a hack + -ldl lib to find
the offset of the modid in the link_map structure.

Tested on x86/amd64/ppc64/s390x. Somewhat tested on ppc32 and arm64.
Untested/a few #ifdef-ed lines not compiled on arm/mips32/mips64
and darwin.

For more background info about thread local storage handling, see
'ELF Handling For Thread-Local Storage' http://www.akkadia.org/drepper/tls.pdf

Changes:
* auxprogs/getoff.c new auxilliary program to get platform specific offsets
  (currently only the offset for the module id in struct link_map).
* configure.ac : check for dlinfo(RTLD_DI_TLS_MODID) needed for getoff.c
* new gdbserver_tests/hgtls, testing various types of __thread variables
* various m_gdbserver files:
  - implement decoding of the QGetTlsAddr query
  - for each platform: platform specific code to get the dtv
  - call to external program getoff-<platform> the first time an
    __thread variable is printed.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14283
2014-08-15 10:27:52 +00:00

38 lines
723 B
Plaintext

# connect gdb to Valgrind gdbserver:
target remote | ./vgdb --wait=60 --vgdb-prefix=./vgdb-prefix-hgtls
echo vgdb launched process attached\n
monitor v.set vgdb-error 999999
#
#
# insert break:
break tls.c:55
command
set $tls_ip = main
if test == &tests[0]
set $tls_ip = &race
end
if test == &tests[1]
set $tls_ip = &local
end
if test == &tests[2]
set $tls_ip = &global
end
if test == &tests[3]
set $tls_ip = &static_extern
end
if test == &tests[4]
set $tls_ip = &so_extern
end
if test == &tests[5]
set $tls_ip = &so_local
end
if test == &tests[6]
set $tls_ip = &global
end
printf "test %s tls_ip %p ip %p equal %d\n", test->name, $tls_ip, ip, $tls_ip == ip
continue
end
# continue till the end
continue
quit