On Fri, Dec 03, 2021 at 01:36:19PM -0600, Eric Blake wrote:
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).
In that case, patch 3 needs something like:
- let output_loc = "lib/states.c", output_lineno () in
+ let output_loc = "lib/states.c", output_lineno () + 1 in
Rich.
$ 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
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top