If I may ask, among the options that Greg had mentioned in the earlier
replies, which was the approach you have chosen?

> We've done something similar in-house running on a Snapdragon with
> an ARM and a Hexagon DSP. We use Android Studio to debug an app on
> the ARM that sends work down to the Hexagon, running an app under Linux.
> On the Hexagon we ran lldb, and were able to debug both apps talking to each 
> other.

You run lldb (client) on both ARM and Hexagon? Or you run lldb-server
on the Hexagon and lldb (client) on ARM? Or something else other than
that?

On Thu, Sep 21, 2017 at 10:34 PM, Ted Woodward
<ted.woodw...@codeaurora.org> wrote:
> We've done something similar in-house running on a Snapdragon with an ARM and 
> a Hexagon DSP. We use Android Studio to debug an app on the ARM that sends 
> work down to the Hexagon, running an app under Linux. On the Hexagon we ran 
> lldb, and were able to debug both apps talking to each other.
>
> --
> Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
> Linux Foundation Collaborative Project
>
>> -----Original Message-----
>> From: lldb-dev [mailto:lldb-dev-boun...@lists.llvm.org] On Behalf Of Greg
>> Clayton via lldb-dev
>> Sent: Thursday, September 21, 2017 10:10 AM
>> To: Ramana <ramana.venka...@gmail.com>
>> Cc: lldb-dev@lists.llvm.org
>> Subject: Re: [lldb-dev] lldb_private::RegisterContext vs
>> lldb_private::RegisterInfoInterface
>>
>>
>> > On Sep 21, 2017, at 5:15 AM, Ramana <ramana.venka...@gmail.com>
>> wrote:
>> >
>> > Sorry, I could not respond yesterday as I was of out of office.
>> >
>> >> Interesting. There are two ways to accomplish this:
>> >> 1 - Treat the CPU as one target and the GPU as another.
>> >> 2 - Treat the CPU and GPU as one target
>> >>
>> >> The tricky things with solution #1 is how to manage switching the
>> >> targets between the CPU and GPU when events happen (CPU stops, or GPU
>> >> stops while the other is running or already stopped). We don't have
>> >> any formal "cooperative targets" yet, but we know they will exist in
>> >> the future (client/server, vm code/vm debug of vm code, etc) so we
>> >> will be happy to assist with questions if and when you get there.
>> >
>> > I was going along the option #1. Would definitely post here with more
>> > questions as I progress, thank you. Fortunately, the way OpenVX APIs
>> > work is, after off-loading the tasks to GPU, they will wait for the
>> > GPU to complete those tasks before continuing further. And in our
>> > case, both CPU and GPU can be controlled separately. Given that, do
>> > you think I still need to bother much about "cooperative targets"?
>>
>> If you just want to make two targets that know nothing about each other, then
>> that is very easy. Is that what you were asking?
>>
>> >
>> >> GPU debugging is tricky since they usually don't have a kernel or
>> >> anything running on the hardware. Many examples I have seen so far
>> >> will set a breakpoint in the program at some point by compiling the
>> >> code with a breakpoint inserted, run to that breakpoint, and then if
>> >> the user wants to continue, you recompile with breakpoints set at a
>> >> later place and re-run the entire program again. Is your GPU any 
>> >> different?
>> >
>> >> We also discussed how to single step in a GPU program. Since multiple
>> >> cores on the GPU are concurrently running the same program, there was
>> >> discussion on how single stepping would work. If you are stepping and
>> >> run into an if/then statement, do you walk through the if and the
>> >> else at all times? One GPU professional was saying this is how GPU
>> >> folks would want to see single stepping happen. So I think there is a
>> >> lot of stuff we need to think about when debugging GPUs in general.
>> >
>> > Thanks for sharing that. Yeah, ours is a little different. Basically,
>> > from the top level, the affinity in our case is per core of the GPU. I
>> > am not there yet to discuss more on this.
>>
>> ok, let me know when you are ready to ask more questions.
>>
>> >
>> >> So we currently have no cooperative targets in LLDB. This will be the 
>> >> first.
>> >> We will need to discuss how hand off between the targets will occur
>> >> and many other aspects. We will be sure to comment when and if you get to
>> this point.
>> >
>> > Thank you. Will post more when I get there.
>>
>> Sounds good.
>> >
>> > Regards,
>> > Ramana
>> >
>> > On Tue, Sep 19, 2017 at 8:56 PM, Greg Clayton <clayb...@gmail.com>
>> wrote:
>> >>
>> >> On Sep 19, 2017, at 3:32 AM, Ramana <ramana.venka...@gmail.com>
>> wrote:
>> >>
>> >> Thank you so much Greg for your comments.
>> >>
>> >> What architecture and os are you looking to support?
>> >>
>> >>
>> >> The OS is Linux and the primary use scenario is remote debugging.
>> >> Basically
>> >> http://lists.llvm.org/pipermail/lldb-dev/2017-June/012445.html
>> >> is what I am trying to achieve and unfortunately that query did not
>> >> get much attention of the members.
>> >>
>> >>
>> >> Sorry about missing that. I will attempt to address this now:
>> >>
>> >> I have to implement a debugger for our HW which comprises of CPU+GPU
>> >> where the GPU is coded in OpenCL and is accelerated through OpenVX
>> >> API in C++ application which runs on CPU. Our requirement is we
>> >> should be able to debug the code running on both CPU and GPU
>> >> simultaneously with in the same LLDB debug session.
>> >>
>> >>
>> >> Interesting. There are two ways to accomplish this:
>> >> 1 - Treat the CPU as one target and the GPU as another.
>> >> 2 - Treat the CPU and GPU as one target
>> >>
>> >> There are tricky areas for both, but for sanity I would suggest options 
>> >> #1.
>> >>
>> >> The tricky things with solution #1 is how to manage switching the
>> >> targets between the CPU and GPU when events happen (CPU stops, or GPU
>> >> stops while the other is running or already stopped). We don't have
>> >> any formal "cooperative targets" yet, but we know they will exist in
>> >> the future (client/server, vm code/vm debug of vm code, etc) so we
>> >> will be happy to assist with questions if and when you get there.
>> >>
>> >> Option #2 would be tricky as this would be the first target that has
>> >> multiple architectures within one process. IF the CPU and GPU be be
>> >> controlled separately, then I would go with option #1 as LLDB
>> >> currently always stops all threads in a process when any thread
>> >> stops. You would also need to implement different register contexts
>> >> for each thread within such a target. It hasn't been done yet, other
>> >> than through the OS plug-ins that can provide extra threads to show
>> >> in case you are doing some sort of user space threading.
>> >>
>> >> GPU debugging is tricky since they usually don't have a kernel or
>> >> anything running on the hardware. Many examples I have seen so far
>> >> will set a breakpoint in the program at some point by compiling the
>> >> code with a breakpoint inserted, run to that breakpoint, and then if
>> >> the user wants to continue, you recompile with breakpoints set at a
>> >> later place and re-run the entire program again. Is your GPU any
>> >> different? Since they will be used in an OpenCL context maybe your
>> >> solution is better? We also had discussions on how to represent the
>> >> various "waves" or sets of cores running the same program on the GPU.
>> >> The easiest solution is to make one thread per distinct core on the
>> >> GPU. The harder way would be to treat a thread as a collection of multiple
>> cores and each variable value now can have one value per core.
>> >>
>> >> We also discussed how to single step in a GPU program. Since multiple
>> >> cores on the GPU are concurrently running the same program, there was
>> >> discussion on how single stepping would work. If you are stepping and
>> >> run into an if/then statement, do you walk through the if and the
>> >> else at all times? One GPU professional was saying this is how GPU
>> >> folks would want to see single stepping happen. So I think there is a
>> >> lot of stuff we need to think about when debugging GPUs in general.
>> >>
>> >> Looking at the mailing list archive I see that there were discussions
>> >> about this feature in LLDB here
>> >> http://lists.llvm.org/pipermail/lldb-dev/2014-August/005074.html.
>> >>
>> >> What is the present status i.e. what works today and what is to be
>> >> improved of simultaneous multiple target debugging support in LLDB?
>> >> Were the changes contributed to LLDB mainstream?
>> >>
>> >>
>> >> So we currently have no cooperative targets in LLDB. This will be the 
>> >> first.
>> >> We will need to discuss how hand off between the targets will occur
>> >> and many other aspects. We will be sure to comment when and if you get to
>> this point.
>> >>
>> >> How can I access the material for
>> >> http://llvm.org/devmtg/2014-10/#bof5
>> >> (Future directions and features for LLDB)
>> >>
>> >> Over the years we have talked about this, but it never really got
>> >> into any real amount of detail and I don't think the BoF notes will help 
>> >> you
>> much.
>> >>
>> >> Appreciate any help/guidance provided on the same.
>> >>
>> >> I do believe approach #1 will work the best. The easiest thing you
>> >> can do is to insulate LLDB from the GPU by putting it behind a GDB server
>> boundary.
>> >> Then we need to really figure out how we want to do GPU debugging.
>> >>
>> >> Hopefully this filled in your missing answers. Let me know what
>> >> questions you have.
>> >>
>> >> Greg
>> >>
>> >> Thanks,
>> >> Ramana
>> >>
>> >> On Mon, Sep 18, 2017 at 8:46 PM, Greg Clayton <clayb...@gmail.com>
>> wrote:
>> >>
>> >> When supporting a new architecture, our preferred route is to modify
>> >> lldb-server (a GDB server binary that supports native debugging) to
>> >> support your architecture. Why? Because this gets you remote
>> >> debugging for free. If you go this route, then you will subclass a
>> >> lldb_private::NativeRegisterContext and that will get used by
>> >> lldb-server (along with lldb_private::NativeProcessProtocol and
>> >> lldb_private::NativeThreadProtocol). If you are adding a new
>> >> architecture to Linux, then you will likely just need to subclass
>> NativeRegisterContext.
>> >>
>> >> The other way to go is to subclass lldb_private::Process,
>> >> lldb_private::Thread and lldb_private::RegisterContext.
>> >>
>> >> The nice thing about the lldb_private::Native* subclasses is that you
>> >> only need to worry about native support. You can use #ifdef and use
>> >> system header files, where as the non native route, those classes
>> >> need to be able to debug remotely and you can't rely on system
>> >> headers (lldb_private::Process, lldb_private::Thread and
>> >> lldb_private::RegisterContext) since they can be compiled on any
>> >> system for possibly local debugging (if current arch/vendor/os
>> >> matches the current system) and remote (if you use lldb-server or another
>> form for RPC).
>> >>
>> >> I would highly suggest getting going the lldb-server route as then
>> >> you can use system header files that contain the definitions of the
>> >> registers and you only need to worry about the native architecture.
>> >> Linux uses ptrace and has much the the common code filtered out into
>> >> correct classes (posix ptrace, linux specifics, and more.
>> >>
>> >> What architecture and os are you looking to support?
>> >>
>> >> Greg Clayton
>> >>
>> >> On Sep 16, 2017, at 6:28 AM, Ramana <ramana.venka...@gmail.com>
>> wrote:
>> >>
>> >> Thank you Greg for the detailed response.
>> >>
>> >> Can you please also shed some light on the NativeRegisterContext.
>> >> When do we need to subclass NativeRegisterContext and (how) are they
>> >> related to RegisterContext<OS>_<Arc It appears that not all
>> >> architectures having RegisterContext<OS>_<Arch> have sub classed
>> >> NativeRegisterContext.
>> >>
>> >> Regards,
>> >> Ramana
>> >>
>> >> On Thu, Sep 14, 2017 at 9:02 PM, Greg Clayton <clayb...@gmail.com>
>> wrote:
>> >>
>> >> Seems like this class was added for testing. RegisterInfoInterface is
>> >> a class that creates a common API for getting
>> >> lldb_private::RegisterInfo structures.
>> >>
>> >> A RegisterContext<OS>_<Arch> class uses one of these to be able to
>> >> create a buffer large enough to store all registers defined in the
>> >> RegisterInfoInterface and will actually read/write there registers
>> >> to/from the debugged process. RegisterContext also caches registers
>> >> values so they don't get read multiple times when the process hasn't
>> >> resumed. A RegisterContext subclass is needed for each architecture
>> >> so we can dynamically tell LLDB what the registers look like for a given
>> architecture.
>> >> It also provides abstractions by letting each register define its
>> >> registers numbers for Compilers, DWARF, and generic register numbers
>> >> like PC, SP, FP, return address, and flags registers. This allows the
>> >> generic part of LLDB to say "I need you to give me the PC register
>> >> for this thread" and we don't need to know that the register is "eip"
>> >> on x86, "rip" on x86_64, "r15" on ARM. RegisterContext classes can
>> >> also determine how registers are
>> >> read/written: one at a time, or "get all general purpose regs" and
>> >> "get all FPU regs". So if someone asks a RegisterContext to read the
>> >> PC, it might go read all GPR regs and then mark them all as valid in
>> >> the register context buffer cache, so if someone subsequently asks
>> >> for SP, it will be already cached.
>> >>
>> >> So RegisterInfoInterface defines a common way that many
>> >> RegisterContext classes can inherit from in order to give out the
>> >> lldb_private::RegisterInfo (which is required by all subclasses of
>> >> RegisterContext) info for a register context, and RegisterContext is
>> >> the one that actually will interface with the debugged process in
>> >> order to read/write and cache those registers as efficiently as possible 
>> >> for
>> the current program being debugged.
>> >>
>> >> On Sep 12, 2017, at 10:59 PM, Ramana via lldb-dev
>> >> <lldb-dev@lists.llvm.org>
>> >> wrote:
>> >>
>> >> Hi,
>> >>
>> >> When deriving RegisterContext<OS>_<Arch>, why some platforms
>> >> (Arch+OS) are deriving it from lldb_private::RegisterContext while
>> >> others are deriving from lldb_private::RegisterInfoInterface or in
>> >> other words how to decide on the base class to derive from between
>> >> those two and what are the implications?
>> >>
>> >> Thanks,
>> >> Ramana
>> >> _______________________________________________
>> >> lldb-dev mailing list
>> >> lldb-dev@lists.llvm.org
>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>> >>
>> >>
>> >>
>> >>
>>
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to