Используйте gdb для вызова метода printDebug

У меня есть класс с методом printDebug. Его не используют в любом месте кода, но я бы хотел использовать его, когда я отлаживаю gdb (используя вызов). Это в основном печатать содержимое объекта в хорошо отформатированном виде, например, я могу иметь вектор множеств. Какой вариант g++ использовать для этого? Я пробовал -O0, но это не работает.

Работа, которую я использовал, заключалась в том, чтобы сделать вызов psuedo в конструкторе для debugPrint и предоставить bool, указывающий, действительно ли вы хотите печатать или ничего не делать. Это прекрасно работает, но должен быть лучший способ сделать это.

Если я правильно понимаю -O0 не должен делать никаких оптимизаций, так что мертвый код не должен быть устранен, но, возможно, я ошибаюсь.

Ответы

Ответ 1

Если у вас есть метод, который нигде не используется в коде gcc, интеллектуальные функции могут идентифицировать это и игнорировать его при компиляции вашего приложения. Поэтому, когда вы показываете символы (используя nm) приложения, этот метод не показывает результаты.

Однако, если вы хотите принудительно скомпилировать этот метод, вам нужно указать _attribute _ used в объявлении метода. Например:

  1 
  2 #include <iostream>
  3 #include <stdio.h>
  4 
  5 
  6 class aClass
  7 {
  8     public:
  9         void __attribute__ ((used)) publicPrint()
 10         {
 11             std::cout << "public method" << std::endl;
 12         }
 13 };
 14 
 15 
 16 int main()
 17 {
 18     aClass my_obj;
 19 
 20     getchar();
 21 }

В целях тестирования я скомпилировал этот исходный код с помощью -g:

g++ -g print_dbg.cpp -o print_dbg

То, что я собираюсь сказать, вероятно, не нужно, но я сделаю это в любом случае: обратите внимание, что my_obj объявляется локальной переменной внутри main(). Это означает, что я имею доступ только к методу publicPrint(), пока я отлаживаю код внутри этой области. Когда выполнение кода переходит к началу getchar(), выполнение кода будет в другой области, то есть другой кадр стека и my_obj больше не будет существовать в этом новом контексте. Это просто голова.

В gdb, если вы установите точку останова, где my_obj допустимо, вы можете выполнить метод publicPrint() через: call my_obj.publicPrint()

$ gdb print_dbg 
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 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 "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/karl/workspace/gdb/print_dbg...done.

(gdb) list main
12              }
13      };
14
15
16      int main()
17      {
18          aClass my_obj;
19
20          getchar();
21      }
(gdb) break main
Breakpoint 1 at 0x804871d: file print_dbg.cpp, line 20.

(gdb) run
Starting program: /home/karl/workspace/gdb/print_dbg 
Breakpoint 1, main () at print_dbg.cpp:20
20          getchar();

(gdb) call my_obj.publicPrint()
public method

(gdb)