From: Ruslan Kabatsayev <b7.10110111@gmail.com>
To: John Baldwin <jhb@freebsd.org>
Cc: Pedro Alves <palves@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Add a 'starti' command.
Date: Sat, 02 Sep 2017 06:28:00 -0000 [thread overview]
Message-ID: <CAHEcG97TbnmD7GRfHWa4FrobMLy+uuK9W+XnFEQMDUL8o=TsXw@mail.gmail.com> (raw)
In-Reply-To: <2289243.bE5E4p8koA@ralph.baldwin.cx>
Hello John,
On 2 September 2017 at 00:42, John Baldwin <jhb@freebsd.org> wrote:
> On Thursday, August 31, 2017 11:51:33 PM Pedro Alves wrote:
>> Hi John,
>>
>> On 08/30/2017 12:54 AM, John Baldwin wrote:
>> > This works like 'start' but it stops at the first instruction rather than
>> > the first line in main(). This is useful if one wants to single step
>> > through runtime linker startup.
>>
>> I like the idea. I actually once wrote a patch quite similar to this.
>> I had called the command "create", inspired by "target_create_inferior".
>> Is there a reason to actually set a breakpoint at the first instruction and
>> run to it, actually? My old prototype just created the inferior and
>> didn't resume it all, see:
>>
>> https://github.com/palves/gdb/commits/create_command
>>
>> though maybe going through normal_stop may be a good idea.
>
> I tried this today and ended up with gdb hung in poll() but not printing a
> prompt or accepting commands still, so I've left it as a breakpoint.
>
Dunno if this helps, but you might want to check what happens inside GDB when
you start an inferior as
gdb -ex 'b *0' -ex run /path/to/program
In this case GDB fails to set the breakpoint (due to invalid access to
address 0x0),
and the `run` command stops exactly at the first instruction. If we
get `starti` to work
using a similar mechanism, I think it'd be just enough on the
implementation side,
no need for any "normal" breakpoints.
>> I agree with Keith - this should really have some tests.
>>
>> For example:
>>
>> - write a global constructor that sets a flag, and then check
>> that the flag is still clear when we're still at the entry point.
>> This can be either a C++ test or a C test using
>> __attribute__ ((constructor))-
>>
>> - After creating the inferior, check that you can manually set
>> a break on main, and continue to it.
>
> I've created a test which does these two (will send a v2 in a minute).
>
>> - Try backtrace, and check that only one frame comes
>> out. That may expose buggy unwinders that don't stop
>> unwinding at the entry point currently, but then that
>> should be fixed anyway, since users will run into that
>> too.
>
> This one didn't work out for me on either FreeBSD or a CentOS 7 VM. I
> know for the FreeBSD case the initial entry point in the runtime linker
> doesn't have any CFI directives that would aid in unwinding, and that
> might be true for ld.so on Linux as well.
>
> FreeBSD:
>
> (gdb) starti
> Starting program: /bin/ls
> Temporary breakpoint 1 at 0x800609650: file /usr/src/libexec/rtld-elf/amd64/rtld_start.S, line 33.
>
> Temporary breakpoint 1, .rtld_start ()
> at /usr/src/libexec/rtld-elf/amd64/rtld_start.S:33
> 33 xorq %rbp,%rbp # Clear frame pointer for good form
> (gdb) where
> #0 .rtld_start () at /usr/src/libexec/rtld-elf/amd64/rtld_start.S:33
> #1 0x0000000000000001 in ?? ()
> #2 0x00007fffffffe648 in ?? ()
> #3 0x0000000000000000 in ?? ()
>
> CentOS 7:
>
> (gdb) starti
> Starting program: /usr/bin/ls
> Temporary breakpoint 1 at 0x7ffff7ddd170
>
> Temporary breakpoint 1, 0x00007ffff7ddd170 in _start ()
> from /lib64/ld-linux-x86-64.so.2
> (gdb) where
> #0 0x00007ffff7ddd170 in _start () from /lib64/ld-linux-x86-64.so.2
> #1 0x0000000000000001 in ?? ()
> #2 0x00007fffffffe6ac in ?? ()
> #3 0x0000000000000000 in ?? ()
>
> --
> John Baldwin
Regards,
Ruslan
next prev parent reply other threads:[~2017-09-02 6:28 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-29 22:55 John Baldwin
2017-08-30 14:14 ` Eli Zaretskii
2017-08-30 22:32 ` Keith Seitz
2017-08-31 21:51 ` Pedro Alves
2017-08-31 22:42 ` John Baldwin
2017-09-01 21:42 ` John Baldwin
2017-09-02 6:28 ` Ruslan Kabatsayev [this message]
2017-09-04 10:57 ` Pedro Alves
2017-09-11 22:08 ` John Baldwin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAHEcG97TbnmD7GRfHWa4FrobMLy+uuK9W+XnFEQMDUL8o=TsXw@mail.gmail.com' \
--to=b7.10110111@gmail.com \
--cc=gdb-patches@sourceware.org \
--cc=jhb@freebsd.org \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox