C 使用不带调试符号的GDB
假设以下代码:C 使用不带调试符号的GDB,c,debugging,gdb,C,Debugging,Gdb,假设以下代码: #include <iostream> void test(){ // } int main(){ return 0; } 这是你错过的 C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起 当你写作时: void test(){ // } 编译器别无选择,只能假设test将由另一个源文件中的代码调用,并将其编译到一个单独的.o文件中。因此,尽管没有定义调试符号,它还是会导出test的符号
#include <iostream>
void test(){
//
}
int main(){
return 0;
}
这是你错过的 C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起 当你写作时:
void test(){
//
}
编译器别无选择,只能假设test
将由另一个源文件中的代码调用,并将其编译到一个单独的.o
文件中。因此,尽管没有定义调试符号,它还是会导出test
的符号
要查看实际效果,请尝试以下操作。首先,将test
标记为static。如果使用优化进行编译,您将看到test
对gdb
不再可见。事实上,它甚至不再被定义。编译器将其内联起来
实现这一点的另一种方法是通过传递
g++
-fwhole程序
选项。此选项告诉gcc假设当前正在编译的文件是整个程序,不存在其他编译单元。这使得它可以有效地将所有函数和全局定义视为静态的。同样,一旦打开优化,您将看到test
对gdb
不再可见
C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起
当你写作时:
void test(){
//
}
编译器别无选择,只能假设test
将由另一个源文件中的代码调用,并将其编译到一个单独的.o
文件中。因此,尽管没有定义调试符号,它还是会导出test
的符号
要查看实际效果,请尝试以下操作。首先,将test
标记为static。如果使用优化进行编译,您将看到test
对gdb
不再可见。事实上,它甚至不再被定义。编译器将其内联起来
实现这一点的另一种方法是通过传递
g++
-fwhole程序
选项。此选项告诉gcc假设当前正在编译的文件是整个程序,不存在其他编译单元。这使得它可以有效地将所有函数和全局定义视为静态的。同样,一旦打开优化,您将看到test
对gdb
是不再可见。查看带有nm的全局符号。使用类似这样的方法:nma.out | c++filt | grep“T”Yes。查看带有nm的全局符号。使用类似这样的代码:nma.out | c++filt | grep“T”