> -----Original Message----- > From: Greg Clayton [mailto:clayb...@gmail.com] > Sent: Tuesday, 19 September, 2017 9:48 PM > To: Tatyana Krasnukha <tatyana.krasnu...@synopsys.com> > Cc: lldb-dev@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.krasnu...@synopsys.com > <mailto:tatyana.krasnu...@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-boun...@lists.llvm.org] On Behalf Of > Greg Clayton via lldb-dev > Sent: Tuesday, 19 September, 2017 6:06 PM > To: cui bixiong <cuibixi...@gmail.com > <mailto:cuibixi...@gmail.com> > > Cc: lldb-dev@lists.llvm.org <mailto:lldb-dev@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 > <cuibixi...@gmail.com <mailto:cuibixi...@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 > <clayb...@gmail.com <mailto:clayb...@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@lists.llvm.org <mailto:lldb-dev@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@lists.llvm.org <mailto:lldb- > d...@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=> > _______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev