PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GDB file sccess



neo2k
08-06-2005, 15:53
hallo,

weiss jemand ob im mit dem GDB einen zugriff auf files überwachen kann ?

ich habe ein programm, welches viele fopen() hat. Jedesmal wenn mit fopen() ein bestimmtes file in dem Dateisystem geoeffnet wird, dann möchte ich das programm anhalten (breakpoint).

Weiss jemand wo ich das finde ?

Vielen Dank
Torsten

Deever
09-06-2005, 04:58
weiss jemand ob im mit dem GDB einen zugriff auf files überwachen kann ?Du plenkst (http://www.sockenseite.de/usenet/plenken.html), warum?


ich habe ein programm, welches viele fopen() hat. Jedesmal wenn mit fopen() ein bestimmtes file in dem Dateisystem geoeffnet wird, dann möchte ich das programm anhalten (breakpoint).Dann tu das.


Weiss jemand wo ich das finde ?Stelle konkrete Fragen. Dann klappts auch mit den Antworten.

Gruß,
/dev

peschmae
09-06-2005, 06:19
Er möchte wohl die Breakpoints nicht manuell setzen, oder?

Man könnte natürlich eine Lib schreiben, die von LD vor dem richtigen FOPEN laden lassen und dann dort einen Breakpoint setzen... :)

MfG Peschmä

neo2k
09-06-2005, 09:58
Hi,

ok, doof gefragt. Sorry.

Also wie man breakpoints setzt weiss ich. Aber das geht nur auf bestimmte files und Zeilennummern. Was ich möchte ist einen Breakpoint sobald mein programm auf eine bestimmte Datei per fopen zugreift. Und das ohne das ich vorher weiss an welche stelle das in meinem Programm passieren kann.

Viele Gruesse
Torsten

Joghurt
09-06-2005, 11:00
Dann kannst du einfach die fopen Funktion mit Hilfe von ld wrappen:

#include <stdio.h>

// Nicht nötig, wenn mit int3 gearbeitet wird
fopen_called_with_foobar()
{
/* nichts */
}

//Deklarieren, damit GCC glücklich ist
FILE* __real_fopen(const char* path, const char* mode);

FILE* __wrap_fopen(const char* path, const char* mode)
{
if (!strcmp(path,"FOOBAR"))
{
fopen_called_with_foobar();
/* ALTERNATIV auf i386 Architektur */
// __asm ("int3");
}
return __real_fopen(path,mode);
}

int main()
{
FILE* f;
f = fopen("asdas","r");
if (!f)
{
perror("fopen asdas");
} else {
fclose(f);
}
f = fopen("FOOBAR","r");
if (!f)
{
perror("fopen FOOBAR");
} else {
fclose(f);
}
}Das kannst du dann mit
gcc -Wl,--wrap,fdopen -g [weitere Optionen] Datei.c compilieren.
Wenn du mit int3 gearbeitet hast, wird gdb automatisch stoppen, ansonsten einfach einen breakpoint auf file_called_with_foobar setzen.