linuxcnc/docs/help/rtfaults.adoc

64 lines
1.8 KiB
Text

:lang: en
= RT Faults
Finding line number information for faults in realtime components
1. Get a version of LinuxCNC which prints the faulting instruction
address (that includes this version of LinuxCNC)
2. Include debugging info in your modules. +
For built-in modules, below the definition of EXTRA_CFLAGS in
Makefile, add:
+
EXTRA_CFLAGS += -g
+
For standalone modules, add the same line just above the line:
+
ifeq ($(BUILDSYS),kbuild)
+
and (re)build the component
3. Run hal until the fault occurs. +
*DO NOT EXIT THE HAL SESSION YET*. +
You must find the start of the module (step 5) first.
4. Note the ip (instruction pointer) address in dmesg, e.g.:
+
RTAPI: Task 1[c2800000]: Fault with vec=14, signo=11 ip=c93dc01a.
^^^^^^^^
5. Find the module which contains the offending IP.
+
$ cat /proc/modules
motmod 142230 0 - Live 0xc93df000
fault 1626 1 motmod, Live 0xc93dc000
hal_lib 30517 2 motmod,fault, Live 0xc93d5000
+
Now you can exit hal/emc2.
6. Subtract the start of the module from the faulting ip (in this case,
0x1a) +
Among other ways to do this, you can use the shell:
+
$ printf "0x%x\n" $((0xc93dc01a-0xc93dc000))
0x1a
7. Use addr2line to find out the source code line:
+
$ addr2line -e emc2-dev/src/fault.ko 0x1a
/usr/src/linux-headers-2.6.32-122-rtai/hal/components/fault.comp:9
+
Ignore how the directory name is wrong and see whether this has helped
you localize the problem:
+
fault.comp:9 *(int*)0 = 0;
+
Yup! Looks like it has.
+
Note that even if you do not prefix the address argument to addr2line
with 0x, it is interpreted as a hex number, and you'll get the wrong
line-number information if passing a decimal number. Thus take care
to always use hex addresses with addr2line.
// vim: set syntax=asciidoc: