Как заставить GDB не печатать значения параметров функции при «входе»? - PullRequest
7 голосов
/ 08 апреля 2009

При достижении точек останова и входе в функции GDB версии 6.8 печатает имя функции, за которым следуют аргументы функции.

Так получилось, что в отлаживаемой программе одним из значений параметра является ОГРОМНАЯ запись, передаваемая по ссылке. gdb печатает имя переменной, за которым следуют ВСЕ ее переменные-члены. Буквально требуется gdb минуту или две, чтобы напечатать все переменные-члены, содержащиеся в классе ... что действительно раздражает при отладке.

Я почти уверен, что есть настройка для отключения этого поведения, что это за настройка?

Ответы [ 2 ]

11 голосов
/ 08 апреля 2009

Наконец-то нашел. Чтобы полностью отключить вывод:

set print frame-arguments none 

Для печати только скалярных значений и игнорирования массивов и структур:

set print frame-arguments scalars 

Чтобы снова включить печать:

set print frame-arguments all
1 голос
/ 08 апреля 2009

У меня есть способ, которым я всегда делал это, но вид вашего вопроса заставил меня любопытно посмотреть, есть ли лучший механизм. Я ничего не нашел.

Вы всегда можете установить точку останова внутри функции, в которую вы входите, но ДО того, как вы сделаете шаг, используйте команду 'groups', чтобы сказать GDB, что вы вообще не хотите ничего печатать, когда он достигает этого точки останова. Пример прояснит ситуацию ...

Вы заметите, что когда я запускаю программу, я останавливаюсь на точке останова в строке 10 (вызов foo), и она печатает мой текущий контекст. После выполнения команды 'command 2' и указания gdb молчать об этой точке останова, когда я нажимаю, ничего не печатается вообще. Я сделал обратный ход (bt), чтобы показать, что я был там, где я хотел быть.

Надеюсь, это поможет:

> cat tmp.cpp

#include <stdio.h>

void foo(int a)
{
        printf ("%d\n", a);
}

int main()
{
        foo(0);

        return 0;
}

> g++ -g tmp.cpp
> gdb a.out
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 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 "i386-redhat-linux-gnu"...
(gdb) break 10
Breakpoint 1 at 0x8048491: file tmp.cpp, line 10.
(gdb) break 5
Breakpoint 2 at 0x804846a: file tmp.cpp, line 5.
(gdb) run
Starting program: /home/ronb/software/a.out

Breakpoint 1, main () at tmp.cpp:10
10              foo(0);
(gdb) commands 2
Type commands for when breakpoint 2 is hit, one per line.
End with a line saying just "end".
>silent
>end
(gdb) c
Continuing.
(gdb) bt
#0  foo (a=0) at tmp.cpp:5
#1  0x0804849d in main () at tmp.cpp:10
(gdb)
...