c++ - 设置 g++ 编译器标志以进行调试

标签 c++

假设我有以下 C++ 代码

int main()
{
    const int n = 10;
    int *pa = new int[n];
    for (int i=0; i!=n; ++i) pa[i] = 0;
    cout << pa[n] << endl;
    delete[] pa;
}

实际上,这段代码可以通过 g++ 编译并运行,但是由于 pa[n] 超出了数组范围,因此会得到错误的结果。

我的问题是:是否可以在编译阶段为 g++ 设置一些调试器标志,以便编译器可以提示我这一点?此外,g++ 中调试的正常标志设置是什么?

最佳答案

使用 -fsanitize=address 进行编译有时可以提供帮助;请参阅AddressSanitizer .

此外,使用 -g 编译并在 valgrind 下运行程序发现许多动态内存错误 ( quick intro )。

一般来说,您希望启用基本的编译器警告。 -Wall -Wextra -pedantic -O2 是一个好的开始。 -O2 从技术上讲是为了优化,但有时你会收到更多/更好的警告。

-g 标志包含已编译代码中的调试信息。如果您使用调试器,您将能够看到局部变量的名称/值、行号等。这可能与重新排序或彻底删除某些代码的优化发生冲突。建议使用-g -Og进行调试(而不是-O2)。

关于c++ - 设置 g++ 编译器标志以进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58144968/

相关文章:

c++ - 使用 getter 设置私有(private)变量

c++ - 您能否像在 C# 中那样在 C++ 中显式设置结构布局/对齐方式?

c++ - opencv 从缓冲区读取 jpeg 图像

c++ - 在函数中获取 c 样式字符串的大小(不是长度)

c++ - 原始缓冲区的分配/损坏 - 如何继续调试?

c++ - 在 Qt 中序列化对象图有哪些方法?

javascript - 获取 json 属性 duktape

c++ - 无法理解二进制文件的读取

c++ - 检测SD卡硬件盘符

c++ - 带有字符串/八进制的 int lambda 表达式? (C++)