pattern matching mit gdb

06/10/2011 - 17:21 von Markus Wichmann | Report spam
Hi all,

ich möchte dem seltsamen Verhalten meiner Shell auf den Grund gehen. Zu
diesem Zweck habe ich sie schon in einer Debug-Version neu kompiliert.
Das Verhalten ist, dass die Shell, bevor das erste Kommando ausgeführt
wird, erstmal auf _alle_ Dateien in den Verzeichnissen aus $PATH stat()
ausführt. Das ist problematisch, weil das eigentliche Kommando dann
erstmal für eine halbe Minute nicht gestartet wird, zumindest direkt
nach Systemstart.

Naja, jedenfalls würde ich gern den GDB dazu bringen, die Shell zu
stoppen, wenn sie stat() aufruft, und zwar mit einem Argument, in dem
die Zeichenfolge "bin" vorkommt. Leider ist in der libc das
entsprechende Argument wegoptimiert worden (ich vermute, gdb kann es
einfach nicht finden), und so kann ich an stat() nur mithilfe von
"catch" anhalten. Das kennt keine Bedingungen. Den Dateinamen kann ich
mir mit "x/s $rdi" anzeigen lassen. Aber wie ich darauf ein pattern
matche, weiß ich nicht.

Ciao,
Markus
 

Lesen sie die antworten

#1 Rainer Weikusat
06/10/2011 - 21:17 | Warnen spam
Markus Wichmann writes:

[...]

Naja, jedenfalls würde ich gern den GDB dazu bringen, die Shell zu
stoppen, wenn sie stat() aufruft, und zwar mit einem Argument, in dem
die Zeichenfolge "bin" vorkommt. Leider ist in der libc das
entsprechende Argument wegoptimiert worden (ich vermute, gdb kann es
einfach nicht finden), und so kann ich an stat() nur mithilfe von
"catch" anhalten. Das kennt keine Bedingungen. Den Dateinamen kann ich
mir mit "x/s $rdi" anzeigen lassen. Aber wie ich darauf ein pattern
matche, weiß ich nicht.



'pattern matching' kann ich dir jetzt auch nicht sagen, aber
sukzessive Zeichenvergleiche sind jedenfalls moeglich:

[]/tmp $cat a.c
#include <sys/stat.h>

int main(void)
{
struct stat st;

stat("aaa", &st);
stat("bbb", &st);
stat("ccc", &st);

return 0;
}
[]/tmp $gcc -O2 -g a.c
[]/tmp $gdb a.out
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /tmp/a.out...done.
(gdb) b main
Breakpoint 1 at 0x4004f0: file a.c, line 4.
(gdb) r
Starting program: /tmp/a.out

Breakpoint 1, main () at a.c:4
4 {
(gdb) n
7 stat("aaa", &st);
(gdb) s
stat () at /usr/include/sys/stat.h:457
457 return __xstat (_STAT_VER, __path, __statbuf);
(gdb) disas __xstat
Dump of assembler code for function *__GI___xstat:
0x00007ffff7b407e0 <*__GI___xstat+0>: cmp $0x1,%edi
0x00007ffff7b407e3 <*__GI___xstat+3>: mov %rsi,%rax
0x00007ffff7b407e6 <*__GI___xstat+6>: ja 0x7ffff7b40800 <*__GI___xstat+32>
0x00007ffff7b407e8 <*__GI___xstat+8>: mov %rax,%rdi
0x00007ffff7b407eb <*__GI___xstat+11>: mov %rdx,%rsi
0x00007ffff7b407ee <*__GI___xstat+14>: mov $0x4,%eax
0x00007ffff7b407f3 <*__GI___xstat+19>: syscall
0x00007ffff7b407f5 <*__GI___xstat+21>: cmp $0xfffffffffffff000,%rax
0x00007ffff7b407fb <*__GI___xstat+27>: ja 0x7ffff7b40814 <*__GI___xstat+52>
0x00007ffff7b407fd <*__GI___xstat+29>: repz retq
0x00007ffff7b407ff <*__GI___xstat+31>: nop
0x00007ffff7b40800 <*__GI___xstat+32>: mov 0x298791(%rip),%rax # 0x7ffff7dd8f98
0x00007ffff7b40807 <*__GI___xstat+39>: movl $0x16,%fs:(%rax)
0x00007ffff7b4080e <*__GI___xstat+46>: mov $0xffffffff,%eax
0x00007ffff7b40813 <*__GI___xstat+51>: retq
0x00007ffff7b40814 <*__GI___xstat+52>: mov 0x29877d(%rip),%rdx # 0x7ffff7dd8f98
0x00007ffff7b4081b <*__GI___xstat+59>: neg %eax
0x00007ffff7b4081d <*__GI___xstat+61>: mov %eax,%fs:(%rdx)
0x00007ffff7b40820 <*__GI___xstat+64>: or $0xffffffffffffffff,%eax
0x00007ffff7b40823 <*__GI___xstat+67>: retq
End of assembler dump.
(gdb) b *0x00007ffff7b407e0 if *(char *)$rsi == 'c' && ((char *)$rsi)[1] == 'c'
Breakpoint 3 at 0x7ffff7b407e0: file ../sysdeps/unix/sysv/linux/wordsize-64/xstat.c, line 37.
(gdb) c
Continuing.

Breakpoint 3, *__GI___xstat (vers=1, name=0x400634 "ccc", buf=0x7fffffffe500) at ../sysdeps/unix/sysv/linux/wordsize-64/xstat.c:37
37 ../sysdeps/unix/sysv/linux/wordsize-64/xstat.c: No such file or directory.
in ../sysdeps/unix/sysv/linux/wordsize-64/xstat.c

Ähnliche fragen