Richard W.M. Jones
2021-Dec-03 19:11 UTC
[Libguestfs] [PATCH libnbd 0/3] generator: Reset line directive after included code in lib/states.c
On Fri, Dec 03, 2021 at 07:02:07PM +0000, Richard W.M. Jones wrote:> This restores the #line directives (probably?) The output looks > right, but I didn't test it beyond opening it in the editor. Do #line > directives have a way to indicate "current file"?What I mean is that if you have: lib/states.c ---------------------------------------- #line 10 "generator/states.c" ... #line 20 -------------------- does the second #line refer to generator/states.c or lib/states.c? Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v
Eric Blake
2021-Dec-03 19:36 UTC
[Libguestfs] [PATCH libnbd 0/3] generator: Reset line directive after included code in lib/states.c
On Fri, Dec 03, 2021 at 07:11:46PM +0000, Richard W.M. Jones wrote:> On Fri, Dec 03, 2021 at 07:02:07PM +0000, Richard W.M. Jones wrote: > > This restores the #line directives (probably?) The output looks > > right, but I didn't test it beyond opening it in the editor. Do #line > > directives have a way to indicate "current file"? > > What I mean is that if you have: > > lib/states.c ---------------------------------------- > #line 10 "generator/states.c" > ... > #line 20 > -------------------- > > does the second #line refer to generator/states.c or lib/states.c?Alas, generator/states.c. Here's how I tested. In particular, note that you MUST use an off-by-one #line directive for the current file (the directive #line 10 must appear on line 9, for gdb to display the code at line 10 on the next step of the program). $ cat foo.c #include <stdio.h> int main(void) { int i = 1; #line 1 "bar.c" i++; // real line 7 i++; // real line 8 #line 10 i++; // real line 10 i++; // real line 11 #line 13 "foo.c" i++; // real line 13 printf("%d\n", i); return 0; } $ cat bar.c i--; // fake line 1 i--; // fake line 2 i--; // fake line 3 i--; // fake line 4 i--; // fake line 5 i--; // fake line 6 i--; // fake line 7 i--; // fake line 8 i--; // fake line 9 i--; // fake line 10 i--; // fake line 11 i--; // fake line 12 i--; // fake line 13 i--; // fake line 14 i--; // fake line 15 $ gcc -g -o foo -Wall foo.c $ gdb ./foo GNU gdb (GDB) Fedora 11.1-5.fc35 ... (gdb) b main Breakpoint 1 at 0x40112e: file foo.c, line 5. (gdb) r Starting program: /home/eblake/libnbd/foo [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". Breakpoint 1, main () at foo.c:5 5 int i = 1; (gdb) n 1 i--; // fake line 1 (gdb) 2 i--; // fake line 2 (gdb) 10 i--; // fake line 10 (gdb) 11 i--; // fake line 11 (gdb) 13 i++; // real line 13 (gdb) 14 printf("%d\n", i); (gdb) 6 15 return 0; (gdb) c Continuing. [Inferior 1 (process 3800760) exited normally] (gdb) q -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org