DebuggingRtapi - rmu75/linuxcnc-wiki GitHub Wiki
date: '2017-10-26T23:40:17' title: DebuggingRtapi
When LinuxCNC 2.7+ is built "--with-realtime=uspace", it is possible to use gdb, including for debugging hardware drivers. However, realtime guarantees are lost when using a debugger on rtapi_app. With older versions, the same instructions apply for "--enable-simulator", except that hardware drivers are not built so they are not debuggable.
First, (re)build linuxcnc: % ./configure --with-realtime=uspace; make If you are going to debug hardware components, you need a PREEMPT-RT kernel and you need to % sudo make setuid
Make sure you have your environment set: % . ../scripts/emc-environment Then start hal and load any component: % halrun halcmd: loadrt and2
Then, in a fresh terminal, start the debugger (use 'sudo' to run the debugger as root if you did 'sudo make setuid' above):
% sudo gdb --pid pidof rtapi_app
Set breakpoints if you wish:
(gdb) break and2.comp:_
No source file named and2.comp.
Make breakpoint pending on future shared library load? (y or [n]) y
Then let rtapi_app continue:
(gdb) continue
In the original terminal, finish setting up your hal components: halcmd: loadrt threads name1=thread period1=1000000 halcmd: addf and2.0 thread halcmd: start halcmd: At this point, gdb will stop at the breakpoint you set earlier: Breakpoint 2 at 0xb7f766e7: file and2.comp, line 8. Pending breakpoint "and2.comp:_" resolved HAL: creating thread thread, 1000000 nsec HAL: thread created THREADS: created 1000 uS thread task 0x80515c0 period = 1000000 ratio=1
Breakpoint 2, _ (inst=0xb7d070b4, period=1000000) at and2.comp:8
8 and2.comp: No such file or directory.
in and2.comp
Current language: auto; currently c
(gdb) print *inst
$1 = {_next = 0x0, in0 = 0xb7d26ee0 "", in1 = 0xb7d26e98 "",
out = 0xb7d26e50 ""}
(gdb) print *inst->in0
$2 = 0 '\0'
To make gdb find the source files, it seems necessary to use the 'directory' command: (gdb) directory ~/emc2.head/src/hal/components/ Source directories searched: /home/jepler/emc2.head/src/hal/components:$cdir:$cwd (gdb) frame 0 #0 _ (inst=0xb7d070b4, period=1000000) at and2.comp:8 8 FUNCTION(_) { out = in0 && in1; } The commands you find yourself executing every time you start gdb can be put in a ".gdbinit" file; see gdb documentation for more information.
gdb will also break in the case of a signal, and you can press ctrl-c to stop it at any time. In case you interrupt it manually, it may be useful to see the stack of each thread: (gdb) thread apply all bt since rtapi_app has one main thread plus one thread for each realtime thread.