Thanks for sharing those details Ted.

Regards,
Ramana

On Sat, Sep 23, 2017 at 2:19 AM, Ted Woodward
<ted.woodw...@codeaurora.org> wrote:
> We treat them as 2 separate targets. We're actually running 2 separate lldb 
> instances - one in Android Studio, and 1 in a shell on Hexagon Linux.
>
> Android Studio is running on the host (x86 Linux or Windows PC). We have an 
> adb shell open to android on the ARM, and from there ssh to Linux on the 
> Hexagon. The DSP doesn't have a direct connection to the outside world; 
> everything goes through the ARM.
>
> Yes, Greg, that's lldb and lldb-server running on the DSP!
>
> --
> Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
> Linux Foundation Collaborative Project
>
>> -----Original Message-----
>> From: Ramana [mailto:ramana.venka...@gmail.com]
>> Sent: Friday, September 22, 2017 6:24 AM
>> To: Ted Woodward <ted.woodw...@codeaurora.org>
>> Cc: Greg Clayton <clayb...@gmail.com>; lldb-dev@lists.llvm.org
>> Subject: Re: [lldb-dev] lldb_private::RegisterContext vs
>> lldb_private::RegisterInfoInterface
>>
>> 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