Ответ 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)