* break when opening certain file
@ 2009-01-13 2:12 peter360
2009-01-13 3:54 ` Doug Evans
0 siblings, 1 reply; 3+ messages in thread
From: peter360 @ 2009-01-13 2:12 UTC (permalink / raw)
To: gdb
I want to set a break point when the program I am debugging opens a certain
file. I can do "break open", but how do I make gdb stop only when file
"foo" is opened? Thanks!
--
View this message in context: http://www.nabble.com/break-when-opening-certain-file-tp21428195p21428195.html
Sent from the Sourceware - gdb list mailing list archive at Nabble.com.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: break when opening certain file
2009-01-13 2:12 break when opening certain file peter360
@ 2009-01-13 3:54 ` Doug Evans
2009-01-15 7:11 ` peter360
0 siblings, 1 reply; 3+ messages in thread
From: Doug Evans @ 2009-01-13 3:54 UTC (permalink / raw)
To: peter360; +Cc: gdb
On Mon, Jan 12, 2009 at 6:11 PM, peter360 <peter360@fastmail.us> wrote:
>
> I want to set a break point when the program I am debugging opens a certain
> file. I can do "break open", but how do I make gdb stop only when file
> "foo" is opened? Thanks!
You want a "conditional breakpoint".
Assuming you're on i386-linux or similar (adjustments are
straightforward for most other platforms),
#include <fcntl.h>
int
main (int argc, char *argv[])
{
int i;
for (i = 1; i < argc; ++i)
open (argv[i], O_RDONLY);
return 0;
}
bash$ gcc -g foo.c
bash$ gdb --args a.out foo bar baz
(gdb) start
(gdb) break open
(gdb) condition 2 strcmp (((char**)$esp)[1], "bar") == 0
(gdb) c
Continuing.
Breakpoint 2, 0x42ce0e80 in open () from /lib/tls/i686/cmov/libc.so.6
(gdb) x/s ((char**)$esp)[1]
0xffffdafe: "bar"
(gdb) c
Continuing.
Program exited normally.
(gdb)
You kinda have to know the i386 calling convention to know that on
entry to open the file name is at ((char**)$esp)[1].
The use of "start" above simplifies a few things, it runs the program
to the start of main(). At this point libc is loaded and any open
calls made while trying to get to main() are skipped.
One caveat is that specifying the condition this way will call
malloc() to allocate space for "bar" so that the call to strcmp will
work. If you don't want to call malloc when testing the breakpoint
condition then one alternative is to manually compare the characters.
A real pain, but if you're debugging a problem and you just need to
have gdb stop at the right file you often don't need to compare every
character in the file name, just enough to get you close. You can
keep hitting continue until the breakpoint hits the right one.
Starting over,
bash$ gdb --args a.out foo bar baz
(gdb) start
(gdb) break open
(gdb) condition 2 ((char**)$esp)[1][0] == 'b'
(gdb) commands 2
x/s ((char**)$esp)[1]
end
(gdb) c
Continuing.
Breakpoint 2, 0x42ce0e80 in open () from /lib/tls/i686/cmov/libc.so.6
0xffffdafe: "bar"
(gdb) c
Continuing.
Breakpoint 2, 0x42ce0e80 in open () from /lib/tls/i686/cmov/libc.so.6
0xffffdb02: "baz"
(gdb) c
Continuing.
Program exited normally.
(gdb)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: break when opening certain file
2009-01-13 3:54 ` Doug Evans
@ 2009-01-15 7:11 ` peter360
0 siblings, 0 replies; 3+ messages in thread
From: peter360 @ 2009-01-15 7:11 UTC (permalink / raw)
To: gdb
Doug Evans-3 wrote:
>
> On Mon, Jan 12, 2009 at 6:11 PM, peter360 <peter360@fastmail.us> wrote:
> You want a "conditional breakpoint".
>
>
This works like a charm! Thanks for the very thorough explanation!
--
View this message in context: http://www.nabble.com/break-when-opening-certain-file-tp21428195p21472491.html
Sent from the Sourceware - gdb list mailing list archive at Nabble.com.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-01-15 7:11 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-13 2:12 break when opening certain file peter360
2009-01-13 3:54 ` Doug Evans
2009-01-15 7:11 ` peter360
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox