64 lines
1.8 KiB
Text
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:
|