Если у вас есть метод, который нигде не используется в коде gcc , интеллектуальные функции могут идентифицировать это и игнорировать его при компиляции приложения. Вот почему при отображении символов (используя нм ) приложения этот метод не отображается в результатах.
Однако, если вы все равно хотите принудительно скомпилировать этот метод, вам нужно указать атрибут _ _ 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)