[lldb-dev] How can lldb debug a remote bare-metal platform?

Tatyana Krasnukha via lldb-dev lldb-dev at lists.llvm.org
Tue Sep 19 13:49:59 PDT 2017


> -----Original Message-----
> From: Greg Clayton [mailto:clayborg at gmail.com]
> Sent: Tuesday, 19 September, 2017 9:48 PM
> To: Tatyana Krasnukha <Tatyana.Krasnukha at synopsys.com>
> Cc: lldb-dev at lists.llvm.org
> Subject: Re: [lldb-dev] How can lldb debug a remote bare-metal platform?
> 
> So the problem is bare boards have no dynamic loader. There is a
> DynamicLoaderStatic which will load files at the address that they are
> specified in the object files. When you load your ELF file using:
> 
> (lldb) file /path/to/foo.elf
> 
> What does:
> 
> (lldb) target list
> 
> show as the output? You might want to specify "none" for both the vendor
> and OS in your target triple when creating your target:
> 

It shows just what expected: * target #0: xxx.elf ( arch=arc-*-*, platform=host )

> (lldb) file --arch armv7-none-none /path/to/foo.elf
> 
> This specifies there is no vendor (first "none" in the triple) and no operating
> system  (second "none" in the triple). The target's triple helps it select the
> right plug-ins to use like the dynamic load plug-in (which tells LLDB where
> sections from binaries got loaded), runtime plug-ins and much more.
> 
> 
> So you might try:
> 
> (lldb) target modules load --load --set-pc-to-entry --slide 0 --file
> /path/to/foo.elf

----set-pc-to-entry, not --set-pc-to-entry. May by typo in sources.

‘target modules load --load ----set-pc-to-entry --slide 0’ is enough, but just compare this text with ‘load’ in gdb… Looks like someone hates bare-metal developers))

> 
> Or, you can specify the addresses of all the sections using:
> 
> (lldb) target modules load --load --set-pc-to-entry --file /path/to/foo.elf .text
> 0x1000 .data 0x2000 ....

This is a good feature, but again, how often is it needed comparing with simple load…

> 
> This allows you to completely control where each section goes and possibly
> skip other sections. It also informs LLDB that sections have been loaded at
> specific addresses.
> 
> FYI: We will have to tweak LLDB for baseboard support as it has been used bit
> by a few folks (check the "svn blame" for who added the "--load" option and
> possibly contact them) but I am sure it needs to be improved.
> 
> So try specifying "--arch <arch>-none-none" and see where that gets you. It
> should select the right dynamic loader plug-in for you.
> 
> A bit more explanation about loading. LLDB has the notion of "file addresses"
> and "load addresses". A file address is valid for one file only, and it is the
> same as the addresses that are contained within the object file (ELF, Mach-O,
> COFF). When breakpoints are set by file + line or by name, we resolve these
> to "section .text + 100 in file foo.elf". Breakpoints can't be set until a section
> has a "load address" which will tell us where each section actually is mapped
> inside the process being debugged. For bare boards there is no dynamic
> linker that tell us '".text" was loaded at address 0x1230000'. If the
> DynamicLoaderStatic is selected for a target, which is done by having no OS in
> the target triple for the target, it will set the load address for the sections to
> match the "file addresses" and breakpoints will then be set. When a section
> is "loaded", a message is sent around LLDB to indicate a section was loaded,
> and all breakpoints will now be able to resolve themselves (get the "load
> address" for each "file address" for each breakpoint) and they will be set in
> the debugged process. Your extra step where you need LLDB to load your
> ELF file is now in the mix as well.
> 
> So I would recommend:
> 1 - create your target first:
>     (lldb) file --arch armv7-none-none /path/to/foo.elf
> 2 - attach to the baseboard
>     (lldb) gdb-remote ....
> 3 - load the file in memory
>     (lldb) target modules load --load --set-pc-to-entry --slide 0 --file
> /path/to/foo.elf
> 4 - set breakpoints now
>     (lldb) breakpoint set ...
> 

Of course I used incorrect order of commands, I just wanted to note that ObjectFile::LoadInMemory should set error status when it cannot write memory.

> 
> Usually you can set the breakpoints before your attach, but in your case you
> probably want to load the ELF file before you set breakpoints, otherwise you
> might end up setting breakpoints as soon as the "gdb-remote ..." attach
> happens since the DynamicLoaderStatic will correctly set the load addresses
> of all your sections after attaching which will cause breakpoint to resolve and
> attempt write traps to memory. Then if we load the ELF file in step #3 and
> when it writes all of the ELF sections to memory it will overwrite the
> breakpoint traps we set. So try the above flow and let us know how things
> go.
> 
> Greg Clayton
> 
> 
> 
> 
> 	On Sep 19, 2017, at 11:21 AM, Tatyana Krasnukha
> <Tatyana.Krasnukha at synopsys.com
> <mailto:Tatyana.Krasnukha at synopsys.com> > wrote:
> 
> 	Hello,
> 
> 	‘target modules load -lp’  fails with error “one or more section name
> + load address pair must be specified”, works only with --slide option.
> 
> 	Another issue is that if breakpoint is set, Process::WriteMemory
> return zero and ObjectFile::LoadInMemory interprets it as an error without
> setting appropriate status. Thus, user sees nothing in output as if command
> succeeds.
> 
> 	Thanks,
> 	Tatyana
> 
> 	From: lldb-dev [mailto:lldb-dev-bounces at lists.llvm.org] On Behalf Of
> Greg Clayton via lldb-dev
> 	Sent: Tuesday, 19 September, 2017 6:06 PM
> 	To: cui bixiong <cuibixiong at gmail.com
> <mailto:cuibixiong at gmail.com> >
> 	Cc: lldb-dev at lists.llvm.org <mailto:lldb-dev at lists.llvm.org>
> 	Subject: Re: [lldb-dev] How can lldb debug a remote bare-metal
> platform?
> 
> 	Load like "target modules load" has a --load option that will load the
> ELF into memory. I think it should do what you want. Let me know how it
> goes.
> 
> 	Greg Clayton
> 
> 
> 		On Sep 18, 2017, at 9:58 PM, cui bixiong
> <cuibixiong at gmail.com <mailto:cuibixiong at gmail.com> > wrote:
> 
> 		Hi Greg:
> 
> 		    It's worked, thank you!, but I still have a question, in GNU-
> GDB which provide `load` command to download a ELF file into bare-board, in
> LLDB support those features? should I dump a binary file and use lldb "target
> module load" to replace 'load' command?
> 
> 		​Best Regards
> 		--cuibixiong​
> 
> 
> 		2017-09-18 23:53 GMT+08:00 Greg Clayton
> <clayborg at gmail.com <mailto:clayborg at gmail.com> >:
> 
> 			So when launching a GDB server there are two flows:
> 
> 			1 - When you connect you already have a process
> 			2 - You will connect, then launch or attach to a
> process
> 
> 			LLDB tries to see if there is a process by sending the
> "qfThreadInfo" packet. As you see below, it responds with on character "l"
> which means  "end of the thread list". Since no thread IDs were returned,
> this makes LLDB believe that there is no process on the other end. So later
> when you try to say "process launch", it tries to send the "A" packet which
> tries to launch your program by sending the name of the process file to
> launch.
> 
> 			There was recently an OpenOCD patch to work
> around this with:
> 
> 			https://reviews.llvm.org/D37934
> <https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__reviews.llvm.org_D37934&d=DwMFaQ&c=DPL6_X_6JkXFx7AXWqB0tg&
> r=yfnu24japkhNGh-
> WqJObHXmH3mINtC_2FO828lrNpM0&m=s1muy0YuwDDElPQxgJ6vznc3dDBx
> kqEqdNbw6v9MesM&s=5prvINiyVrMl8bpYzRwFlVWxIlsjH79K0W9MyCGhDu
> M&e=>
> 
> 			This fixed this issue and also made it read both sets of
> registers via the XML target packets.
> 
> 			That should make things work, but it would be better
> if we modified the OpenOCD GDB server to respond with a thread ID when
> asked about its thread with the "qfThreadInfo" packet. Since it is a bare
> board connection, it should respond with "1" (one) to the "qfThreadInfo"
> packet followed by "l" to the next ThreadInfo packet (read GDB protocol
> docs on this.
> 
> 			Let me know if the patch mentioned above (which is
> already checked in) fixed your issues.
> 
> 
> 
> 
> 				On Sep 17, 2017, at 3:50 AM, cui bixiong via
> lldb-dev <lldb-dev at lists.llvm.org <mailto:lldb-dev at lists.llvm.org> > wrote:
> 
> 				Hi:
> 
> 				    Currently I porting lldb for Hifive1 (riscv
> bare board) w/ openocd 0.10.0, but it always show "error: Process must be
> launched."
> 
> 				    I use GNU gdb to remote connect and
> debugging w/ the same openocd + elf, it work OK.
> 
> 				    I want to know how to launch Process in
> bare board?
> 
> 				    thanks a lot!
> 
> 				$ lldb
> 				(lldb) log enable gdb-remote packets
> 				(lldb) target create Build3/riscv-hello.elf
> 				Current executable set to 'Build3/riscv-
> hello.elf' (riscv).
> 				(lldb) gdb-remote 172.27.113.29:3333
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__172.27.113.29-
> 3A3333_&d=DwMFaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=yfnu24japkhNGh-
> WqJObHXmH3mINtC_2FO828lrNpM0&m=s1muy0YuwDDElPQxgJ6vznc3dDBx
> kqEqdNbw6v9MesM&s=VOu2PpXUGoyMKI8l3ZgwFP5o1vdRygwBr4rzl-
> CmFX0&e=>
> 				<   1> send ack packet: +
> 				history[1] tid=0x44c8 <   1> send packet: +
> 				<   1> read packet: +
> 				<  19> send SendPacketNoLock 2 packet:
> $QStartNoAckMode#b0
> 				<   1> read packet: +
> 				<   6> read packet: $OK#9a
> 				<   1> send ack packet: +
> 				<  41> send SendPacketNoLock 2 packet:
> $qSupported:xmlRegisters=i386,arm,mips#12
> 				<  80> read packet:
> $PacketSize=3fff;qXfer:memory-map:read+;qXfer:features:read-
> ;QStartNoAckMode+#08
> 				<  26> send SendPacketNoLock 2 packet:
> $QThreadSuffixSupported#e4
> 				<   4> read packet: $#00
> 				<  27> send SendPacketNoLock 2 packet:
> $QListThreadsInStopReply#21
> 				<   4> read packet: $#00
> 				<  13> send SendPacketNoLock 2 packet:
> $qHostInfo#9b
> 				<   4> read packet: $#00
> 				<  10> send SendPacketNoLock 2 packet:
> $vCont?#49
> 				<   4> read packet: $#00
> 				<  27> send SendPacketNoLock 2 packet:
> $qVAttachOrWaitSupported#38
> 				<   4> read packet: $#00
> 				<  16> send SendPacketNoLock 2 packet:
> $qProcessInfo#dc
> 				<   4> read packet: $#00
> 				<   6> send SendPacketNoLock 2 packet:
> $qC#b4
> 				<   7> read packet: $QC0#c4
> 				<  16> send SendPacketNoLock 2 packet:
> $qfThreadInfo#bb
> 				<   5> read packet: $l#6c
> 				(lldb) thread list
> 				error: Process must be launched.
> 				(lldb) b main
> 				Breakpoint 1: where = riscv-hello.elf`main at
> hello.c:3, address = 0x20400230
> 				(lldb) thread continue
> 				error: invalid thread
> 				(lldb) process launch
> 				<  38> send SendPacketNoLock 2 packet:
> $QSetSTDIN:2f6465762f7074732f343238#b6
> 				<   4> read packet: $#00
> 				<  39> send SendPacketNoLock 2 packet:
> $QSetSTDOUT:2f6465762f7074732f343238#17
> 				<   4> read packet: $#00
> 				<  39> send SendPacketNoLock 2 packet:
> $QSetSTDERR:2f6465762f7074732f343238#08
> 				<   4> read packet: $#00
> 				<  21> send SendPacketNoLock 2 packet:
> $QSetDisableASLR:1#ce
> 				<   4> read packet: $#00
> 				<  23> send SendPacketNoLock 2 packet:
> $QSetDetachOnError:1#f8
> 				<   4> read packet: $#00
> 				<  21> send SendPacketNoLock 2 packet:
> $QLaunchArch:riscv#8b
> 				<   4> read packet: $#00
> 				<  33> send SendPacketNoLock 2 packet:
> $QEnvironment:BINARY_TYPE_HPC=#fd
> 				<   4> read packet: $#00
> 				< 115> send SendPacketNoLock 2 packet:
> $A104,0,2f70726f6a2f6d746b31333836372f727369632d762f74657374696e672f
> 4275696c64332f72697363762d68656c6c6f2e656c66#6c
> 				<   4> read packet: $#00
> 				error: process launch failed: 'A' packet
> returned an error: -1
> 
> 
> 
> 				Best Regards
> 				--cuibixiong
> 
> 	_______________________________________________
> 				lldb-dev mailing list
> 				lldb-dev at lists.llvm.org <mailto:lldb-
> dev at lists.llvm.org>
> 				http://lists.llvm.org/cgi-
> bin/mailman/listinfo/lldb-dev
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-
> 2Dbin_mailman_listinfo_lldb-
> 2Ddev&d=DwMFaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=yfnu24japkhNGh-
> WqJObHXmH3mINtC_2FO828lrNpM0&m=s1muy0YuwDDElPQxgJ6vznc3dDBx
> kqEqdNbw6v9MesM&s=Yl9wZ2nbojjqtk8CUuyh6ANapwgmBwf8jEC0CFcmG
> Nk&e=>
> 



More information about the lldb-dev mailing list