[lldb-dev] LLDB using Valgrind's embedded gdbserver

Daniel Trebbien via lldb-dev lldb-dev at lists.llvm.org
Thu Dec 3 16:24:40 PST 2015


Hello,

I am working on enhancing Valgrind's embedded gdbserver to allow LLDB to
use it (https://bugs.kde.org/show_bug.cgi?id=356174 ).  After adding
support for 'qC' packets to the embedded gdbserver, LLDB is able to
continue the halted program running under Valgrind; however, a short moment
later LLDB crashes.

I am using OS X 10.11.1 (15B42) and lldb-340.4.110.1.

The location of the segmentation fault is
ABISysV_x86_64::GetArgumentValues(lldb_private::Thread&,
lldb_private::ValueList&) const + 147:

[  0] 0x000000010432d7ad
LLDB`ABISysV_x86_64::GetArgumentValues(lldb_private::Thread&,
lldb_private::ValueList&) const + 147 at ABISysV_x86_64.cpp:485:32
       481 	    addr_t current_stack_argument = sp + 8; // jump over
return address
       482 	
       483 	    uint32_t argument_register_ids[6];
       484 	
    -> 485 	    argument_register_ids[0] = reg_ctx->GetRegisterInfo
(eRegisterKindGeneric,
LLDB_REGNUM_GENERIC_ARG1)->kinds[eRegisterKindLLDB];


Someone at Apple Developer Relations (ADR) informed me that unlike
gdb, lldb does not have an initial target definition set, and relies
on the gdbserver to tell it which registers the gdbserver supports.
This can be done either by responding to 'qRegisterInfo XX' packets or
to 'qXfer:features:read:target.xml'.


ADR also informed me about the
plugin.process.gdb-remote.target-definition-file LLDB setting and the
example target definitions at
http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/

I can confirm that using either x86_64_linux_target_definition.py or
x86_64_target_definition.py fixes the segfault issue.


Valgrind's gdbserver does not support qRegisterInfo, but it does
support qXfer:features:read:target.xml.


Enabling LLDB's gdb-remote logging, I am seeing that the Valgrind
embedded gdbserver is sending:


target.xml:

```

<?xml version="1.0"?>
<!-- Copyright (C) 2010 Free Software Foundation, Inc.

     Copying and distribution of this file, with or without modification,
     are permitted in any medium without royalty provided the copyright
     notice and this notice are preserved.  -->

<!-- AMD64 - core and sse and avx.  -->

<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target>
  <architecture>i386:x86-64</architecture>
  <xi:include href="64bit-core.xml"/>
  <xi:include href="64bit-sse.xml"/>
  <xi:include href="64bit-avx.xml"/>
</target>

```


64bit-core.xml:

```

<?xml version="1.0"?>
<!-- Copyright (C) 2010 Free Software Foundation, Inc.

     Copying and distribution of this file, with or without modification,
     are permitted in any medium without royalty provided the copyright
     notice and this notice are preserved.  -->

<!DOCTYPE feature SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.i386.core">
  <flags id="i386_eflags" size="4">
    <field name="CF" start="0" end="0"/>
    <field name="" start="1" end="1"/>
    <field name="PF" start="2" end="2"/>
    <field name="AF" start="4" end="4"/>
    <field name="ZF" start="6" end="6"/>
    <field name="SF" start="7" end="7"/>
    <field name="TF" start="8" end="8"/>
    <field name="IF" start="9" end="9"/>
    <field name="DF" start="10" end="10"/>
    <field name="OF" start="11" end="11"/>
    <field name="NT" start="14" end="14"/>
    <field name="RF" start="16" end="16"/>
    <field name="VM" start="17" end="17"/>
    <field name="AC" start="18" end="18"/>
    <field name="VIF" start="19" end="19"/>
    <field name="VIP" start="20" end="20"/>
    <field name="ID" start="21" end="21"/>
  </flags>

  <reg name="rax" bitsize="64" type="int64"/>
  <reg name="rbx" bitsize="64" type="int64"/>
  <reg name="rcx" bitsize="64" type="int64"/>
  <reg name="rdx" bitsize="64" type="int64"/>
  <reg name="rsi" bitsize="64" type="int64"/>
  <reg name="rdi" bitsize="64" type="int64"/>
  <reg name="rbp" bitsize="64" type="data_ptr"/>
  <reg name="rsp" bitsize="64" type="data_ptr"/>
  <reg name="r8" bitsize="64" type="int64"/>
  <reg name="r9" bitsize="64" type="int64"/>
  <reg name="r10" bitsize="64" type="int64"/>
  <reg name="r11" bitsize="64" type="int64"/>
  <reg name="r12" bitsize="64" type="int64"/>
  <reg name="r13" bitsize="64" type="int64"/>
  <reg name="r14" bitsize="64" type="int64"/>
  <reg name="r15" bitsize="64" type="int64"/>

  <reg name="rip" bitsize="64" type="code_ptr"/>
  <reg name="eflags" bitsize="32" type="i386_eflags"/>
  <reg name="cs" bitsize="32" type="int32"/>
  <reg name="ss" bitsize="32" type="int32"/>
  <reg name="ds" bitsize="32" type="int32"/>
  <reg name="es" bitsize="32" type="int32"/>
  <reg name="fs" bitsize="32" type="int32"/>
  <reg name="gs" bitsize="32" type="int32"/>

  <reg name="st0" bitsize="80" type="i387_ext"/>
  <reg name="st1" bitsize="80" type="i387_ext"/>
  <reg name="st2" bitsize="80" type="i387_ext"/>
  <reg name="st3" bitsize="80" type="i387_ext"/>
  <reg name="st4" bitsize="80" type="i387_ext"/>
  <reg name="st5" bitsize="80" type="i387_ext"/>
  <reg name="st6" bitsize="80" type="i387_ext"/>
  <reg name="st7" bitsize="80" type="i387_ext"/>

  <reg name="fctrl" bitsize="32" type="int" group="float"/>
  <reg name="fstat" bitsize="32" type="int" group="float"/>
  <reg name="ftag" bitsize="32" type="int" group="float"/>
  <reg name="fiseg" bitsize="32" type="int" group="float"/>
  <reg name="fioff" bitsize="32" type="int" group="float"/>
  <reg name="foseg" bitsize="32" type="int" group="float"/>
  <reg name="fooff" bitsize="32" type="int" group="float"/>
  <reg name="fop" bitsize="32" type="int" group="float"/>
</feature>

```


(64bit-sse.xml and 64bit-avx.xml omitted.)


Can anyone see why this XML target definition would be causing the crash?


Daniel Trebbien
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20151203/6fd7d4bc/attachment-0001.html>


More information about the lldb-dev mailing list