[Berlin-wireless] OLSRD ipv4 crashes
Stefan Sperling
stsp
Mo Aug 3 14:30:25 CEST 2015
On Sun, Aug 02, 2015 at 05:18:30PM +0200, André Gaul wrote:
> On 08/02/2015 05:06 PM, Stefan Sperling wrote:
> > Kann ich bestätigen (graefe70, kathleen 0.1.2). Ich habe einen cronjob
> > drin der jede minute guckt und ggf. neustartet.
> >
> > * * * * * pgrep -fl 'olsrd -f /var/etc/olsrd.conf' || /etc/init.d/olsrd start
>
> thx, das habe ich jetzt auch drin.
Da ist noch ein Fehler drin gewesen. Der Cronjob selbst kann auch
von pgrep gemachted werden, und in diesem Fall started olsrd nicht neu.
Als workaround kann man sich die Tatsache zu nutzen machen dass olsrd
ein Kindprozess von PID 1 ist:
* * * * * /usr/bin/pgrep -P 1 -f 'olsrd.conf' || /etc/init.d/olsrd start
* * * * * /usr/bin/pgrep -P 1 -f 'olsrd6.conf' || /etc/init.d/olsrd6 start
> das ist aber sehr unbefriedigend.
Ja :-/
Ich habe auf der graefe70 einen core file gefunden:
http://stsp.name/olsrd.1584.11.1437235328.core
Und dazu eine neue olsrd binary mit debug symbols kompiliert.
Damit zeigt gdb an, dass ein timer event mit NULL pointern zum crash führt.
Kann damit jemand etwas anfangen?
Der Stacktrace könnte aber auch Unsinn sein. Ich würde erwarten dass der
oberste Stack Frame in walk_timers() ist, nicht in olsr_seq_inrange_high().
Und die Zeilennummer von scheduler.c ist eins zu hoch für list_remove().
Vermutlich passt also meine binary nicht zum core dump.
Hat jemand die original kathleen 0.1.2 olsrd binary mit debug symbols?
0.1.2 ist leider nicht im git getagged. Es gibt nur einen branch der
so heisst. Habe ich den falschen commit erwischt? Von welchem git commit
wurden die 0.1.2 binaries gebaut?
stsp at noel:~/freifunk/firmware$ git describe
v0.1.1-4-gded0392
stsp at noel:~/freifunk/firmware/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/olsrd-0.9.0.2$ ../../toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/gdb-li
naro-7.6-2013.05/gdb/gdb olsrd ~/olsrd.1584.11.1437235328.core
(gdb) bt
#0 0x00409160 in list_remove (del_node=0xc67818) at src/common/list.c:107
#1 0x0041b9d6 in olsr_change_timer (timer=0xc67818, rel_time=<optimized out>, jitter_pct=0 '\000', periodical=<optimized out>) at src/scheduler.c:880
#2 0x0041bc22 in olsr_seq_inrange_high (beg=13006872, end=0, seq=6816) at src/tc_set.c:114
0x00409160 in list_remove (del_node=0xc67818) at src/common/list.c:107
107 list_node_init(del_node);
(gdb) p *del_node
$7 = {next = 0x0, prev = 0x0}
(gdb) up
#1 0x0041b9d6 in olsr_change_timer (timer=0xc67818, rel_time=<optimized out>, jitter_pct=0 '\000', periodical=<optimized out>) at src/scheduler.c:880
880 list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
(gdb) p *timer
$8 = {timer_list = {next = 0x0, prev = 0x0}, timer_clock = 1387321741, timer_period = 0, timer_cookie = 0xc27190, timer_jitter_pct = 0 '\000',
timer_flags = 0 '\000', timer_random = 1454529863, timer_cb = 0x418155 <olsr_expire_spf_backoff+16>, timer_cb_context = 0x0}
Code von diesen Frame:
875 /*
876 * Changes are easy: Remove timer from the exisiting timer_wheel slot
877 * and reinsert into the new slot.
878 */
879 list_remove(&timer->timer_list);
880 list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
Mehr Informationen über die Mailingliste Berlin