Re: GDB 7's process record/replay & BDW-GC
ludo-mXXj517/[email protected] (Ludovic Courtès) Wed, 28 Oct 2009 23:53:41 +0100
| Newsgroups | gmane.comp.programming.garbage-collection.boehmgc,gmane.comp.gdb.bugs.general |
|---|---|
| Message-ID | <[email protected]> |
Hi, ludo-mXXj517/[email protected] (Ludovic Court=C3=A8s) writes: > Process record doesn't support instruction 0xf6e at address 0x7ffff789f= 2f2. > Process record: failed to record execution log. > > Program received signal SIGTRAP, Trace/breakpoint trap. > 0x00007ffff789f2f0 in memset () from /nix/store/s88vdfglm94x7jn0vqm24pq= hq460s0c7-glibc-2.9/lib/libc.so.6 I should have started with that: a web search shows that it=E2=80=99s a k= nown issue, not specific to libgc: http://sources.redhat.com/bugzilla/show_bug.cgi?id=3D10743 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D550710 The suggested workaround allows it to go a bit further: --8<---------------cut here---------------start------------->8--- Breakpoint 1, main (argc=3D1, argv=3D0x7fffffffc8e8) at ,,t.c:6 6 GC_INIT (); (gdb) set __x86_64_preferred_memory_instruction=3D0 (gdb) record=20 (gdb) n warning: Process record ignores the memory change of instruction at addre= ss 0x7ffff7612e5a because it can't get the value of the segment register. warning: Process record ignores the memory change of instruction at addre= ss 0x7ffff784e8c3 because it can't get the value of the segment register. Process record doesn't support instruction 0xfae at address 0x7ffff7862c0= 0. Process record: failed to record execution log. Program received signal SIGTRAP, Trace/breakpoint trap. 0x00007ffff7862c00 in getcontext () from /nix/store/s88vdfglm94x7jn0vqm24= pqhq460s0c7-glibc-2.9/lib/libc.so.6 (gdb) bt #0 0x00007ffff7862c00 in getcontext () from /nix/store/s88vdfglm94x7jn0v= qm24pqhq460s0c7-glibc-2.9/lib/libc.so.6 #1 0x00007ffff7b96cfa in GC_with_callee_saves_pushed (fn=3D<value optimi= zed out>, arg=3D0x7fffffffc73c "") at ../mach_dep.c:194 #2 0x00007ffff7b8e795 in GC_push_roots (all=3D<value optimized out>, col= d_gc_frame=3D0x7fffffffc73c "") at ../mark_rts.c:790 #3 0x00007ffff7b8df0c in GC_mark_some (cold_gc_frame=3D0x7fffffffc73c ""= ) at ../mark.c:359 #4 0x00007ffff7b853f8 in GC_stopped_mark (stop_func=3D0x7ffff7b846d0 <GC= _never_stop_func>) at ../alloc.c:602 #5 0x00007ffff7b8568d in GC_try_to_collect_inner (stop_func=3D0x7ffff7b8= 46d0 <GC_never_stop_func>) at ../alloc.c:421 #6 0x00007ffff7b905c2 in GC_init () at ../misc.c:843 #7 0x0000000000400788 in main (argc=3D1, argv=3D0x7fffffffc8e8) at ,,t.c= :6 --8<---------------cut here---------------end--------------->8--- That=E2=80=99s the =E2=80=98stmxcsr=E2=80=99 instruction, apparently an M= MX2 instruction, unconditionally used by the linux/x86_64 getcontext(3) implementation. I find it surprising that getcontext(3) doesn=E2=80=99t have a mechanism = akin to =E2=80=98__x86_64_preferred_memory_instruction=E2=80=99 to choose whether= or not to use MMX2 instructions. Comments? Thanks, Ludo=E2=80=99.