Распечатать содержимое файла, открытого с помощью fopen в GDB?

#c #gdb #fopen

Вопрос:

Я пытаюсь распечатать содержимое файла, открытого с помощью fopen на C в GDB.

Например, возьмем следующий код на языке Си:

 #include lt;stdio.hgt; #include lt;stdlib.hgt;  int main() {  FILE *file;  file = fopen("/etc/passwd", "r");  fclose(file);  return 0; }  

Я хотел бы иметь возможность просматривать содержимое этого файла при запуске скомпилированного исполняемого файла в GDB. Спасибо Тебе!

Комментарии:

1. Что вы пробовали? Как это работало? Как же это не сработало?

Ответ №1:

Я пытаюсь распечатать содержимое файла, открытого с помощью fopen на C в GDB.

Вам нужно libc , чтобы он был скомпилирован с отладочной информацией. Например, в Linux, используя GLIBC и с libc6-dbg установленной, используя вашу примерную программу, измененную для фактического чтения файла (просто fopen ing и сразу fclose после этого файл ничего не читает):

 #include lt;stdio.hgt; #include lt;stdlib.hgt;  int main() {  FILE *file;  file = fopen("/etc/passwd", "r");  int ch = fgetc(file); /* force a read */  fclose(file);  return 0; }  (gdb) start Temporary breakpoint 1 at 0x115d: file t.c, line 6. Starting program: /tmp/a.out  Temporary breakpoint 1, main () at t.c:6 6 file = fopen("/etc/passwd", "r"); (gdb) n 7 int ch = fgetc(file); (gdb) n 8 fclose(file); (gdb) p *file $1 = {_flags = -72539000, _IO_read_ptr = 0x555555559481 "oot:x:0:0:root:/root:/bin/bashn"..., _IO_read_end = 0x55555555a1c6 "", ..., _IO_read_base = 0x555555559480 "root:x:0:0:root:/root:/bin/bashn"...  

Здесь вы можете видеть , что данные, которые будут возвращены при последующих чтениях, указаны file-gt;_IO_read_ptr , и весь буфер указан file-gt;_IO_read_base .

Члены будут зависеть от того, какие libc вы используете, а объем буферизованных данных (если таковые имеются) будет зависеть от буферизации, с которой был открыт поток.

Ответ №2:

Вы можете использовать функцию вызова. Вы пишете функцию, которая печатает содержимое файла по вашему желанию, и вызываете ее из gdb.

 (gdb) help call Call a function in the program. Usage: call EXP  

Аргумент-это имя функции и аргументы в обозначении текущего рабочего языка. Результат печатается и сохраняется в истории значений, если он не является недействительным.

Конечно, в этой функции вы должны сохранить позицию файла-ftell в начале, fseek в конце и т. Д.


 #include lt;stdio.hgt; #include lt;stdlib.hgt;  void debug_file(FILE*f) {  printf("keep ftell, read, print, restore positionn"); }  int main() {   .... }  % gcc -O0 -g3 gbd.c % gdb ./a.out Reading symbols from ./a.out... (gdb) break main Breakpoint 1 at 0x118f: file gbd.c, line 12. (gdb) r Starting program: /work/stub/a.out  Breakpoint 1, main () at gbd.c:12 12 file = fopen("/etc/passwd", "r"); (gdb) n 13 int ch = fgetc(file); /* force a read */ (gdb) 14 fclose(file); (gdb) call debug_file(file) keep ftell, read, print, restore position (gdb) c Continuing. [Inferior 1 (process 6432) exited normally] (gdb)  

Комментарии:

1. Это вообще не отвечает на вопрос.

2. @EmployedRussian, однако, это распространенный метод в программировании на языке Си. Конечно, не специально для печати содержимого файла, а для печати различных внутренних компонентов. Но да, если вы вообще откажетесь от своего заявления, оно может оказаться правдой.

3. @alinsoar не могли бы вы привести пример в gdb с тем же/аналогичным кодом, что и я?