Debugging Epiphany - adapteva/epiphany-sdk GitHub Wiki
e-server
(Work in progress)
Start e-server
Start e-server in one terminal.
$ e-server --multiprocess
Start a program
In a second terminal we start a host program:
Let's use e-prime from epiphany-examples for this tutorial.
Build e-prime:
$ cd ~/epiphany-examples/apps/e-prime
$ git pull
$ ./build.sh
Start the program. EHAL_GDBSERVER
will make e-hal
start any epiphany program in a halted debug mode. This is useful if you want to be able to debug a program from the beginning.
$ EHAL_GDBSERVER=yes ./run.sh
You will notice that e-prime reports 0 primes factored / s. This is because the epiphany cores are not running yet, because of EHAL_GDBSERVER
. The next step is to attach with the e-gdb client and start debugging.
gdb
In a third terminal, start e-gdb
. You can either do this on your parallella or on your local computer if you have esdk-2016.11.x86_64 installed.
$ cd ~/epiphany-examples/apps/e-prime
$ epiphany-elf-gdb e_prime.elf
Enable non-stop mode. This must to be done before connecting to e-server. We also need to disable pagination as it breaks non-stop.
(gdb) set pagination off
(gdb) set non-stop on
Connect to the e-server. You'll need to adjust localhost
to parallella.local.
if you use e-gdb from your local computer.
(gdb) target extended-remote localhost:51000
List processes:
(gdb) info os processes
Attach to the default process (workgroup). The default process contains all cores that have not yet been manually assigned to a workgroup. To create a new workgroup, use the monitor workgroup
command. The syntax is monitor workgroup [ROW0] [COL0] [ROWS] [COLS]
.
(gdb) attach 1
Show status for all threads:
(gdb) info threads
Ah, all threads are stopped. This is because we started the host program with EHAL_GDBSERVER=yes
.
That's why e-prime reports zero primes/s. You'll notice that all threads are stopped in _start()
. This is the low level program entry point, which is called even before main()
. So it's possible to set a breakpoint on any early function call in the epiphany program, even main()
.
Now, let's continue the current thread and see what happens in the e-prime terminal.
(gdb) continue
Finally we can see some primes being generated in the e-prime terminal.
Press Ctrl-C to stop the thread
It's also possible to continue a thread in the background. Append &
to continue a thread asynchronously.
(gdb) continue &
Now it's possible to issue commands to gdb while the thread is running in the background. Let's verify that the thread is really running.
(gdb) info threads
Use the interrupt
command to stop a thread that was started asynchronously:
(gdb) interrupt
Verify that the thread is stopped:
(gdb) info threads
The -a
flag is a shortcut to continue all threads:
(gdb) continue -a &
Similarly -a
can also be used to interrupt all threads:
(gdb) interrupt -a
Set a breakpoint (will be applied to all threads):
(gdb) break is_prime
Continue all threads asynchronously:
(gdb) continue -a &
Finally when you're done debugging, detach from process:
(gdb) detach