从调试器中调用未使用的函数
C++ - Calling unused function from debugger
在OSX上使用llvm和lldb,我有以下代码:
#include <stdio.h>
class A{
public:
void f() __attribute__((noinline))
{
printf("f()n");
}
void g() __attribute__((noinline))
{
printf("g()n");
}
};
int main()
{
A a;
a.g();
return 0;
}
当打破main(),并试图调用p a.f()
从调试器我得到:
错误:cannot lookup symbols: __ZN1A1fEv
调用p g.f()
效果很好。
我知道f()可能会被优化掉,但是有没有办法禁用这种优化,所以我可以在调试器中使用它?
谢谢!
虽然将定义移出行可能在某些情况下有帮助,但它不会在所有情况下都有帮助,例如,如果它不是odr c++成员函数,而只是一个静态函数,或者如果您的整个程序是LTO优化的,并且该函数没有在本地翻译单元之外被引用。
在这些情况下(可能也是这种情况),您应该将函数标记为__attribute__((used))
,以告诉编译器该函数被使用,并确保在结果对象文件中为它生成代码-这也意味着将生成调试信息。
你的最终代码将看起来像这样:
#include <stdio.h>
class A {
public:
void f() __attribute__((noinline, used))
{
printf("f()n");
}
void g() __attribute__((noinline))
{
printf("g()n");
}
};
int main()
{
A a;
a.g();
return 0;
}
这是设计__attribute__((used))
的原因之一。来自gcc文档:
这个附加到函数的属性意味着必须为该函数发出代码,即使该函数似乎没有被引用。例如,当函数仅在内联汇编中被引用时,这很有用。当应用于c++类模板的成员函数时,该属性还意味着,如果类本身被实例化,则该函数也被实例化。
这意味着即使不使用该函数,也保证在所有情况下都会发出该函数。
(作为进一步的补充,我还没有验证这实际上会为LTO优化工作-它可能应该,但我打赌这是一个不经常想到的角落案例,我直到现在才想到,我在LTO工作:)
将f
的定义移出类:
#include <stdio.h>
class A {
public:
void f();
void g() __attribute__((noinline))
{
printf("g()n");
}
};
void A::f()
{
printf("f()n");
}
int main()
{
A a;
a.g();
return 0;
}
这已经为我工作与$ g++ t.cc
和$ g++ -g t.cc
在Linux上与gcc 4.8.4。它可能也适用于你的工具链。
$ g++ t.cc
$ nm a.out | grep _ZN1A
000000000040052e T _ZN1A1fEv
0000000000400562 W _ZN1A1gEv
作为一种替代方法,正如在echristo的回答中所描述的,将used
添加到f
的属性中,并将其保留在类中。这也适用于$ g++ .cc and
$ g++ -g .cc ':
$ g++ -g t.cc
0000000000400548 W _ZN1A1fEv
0000000000400560 W _ZN1A1gEv
添加used
也适用于g++ -O2 -g t.cc
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 未使用的C++未优化的静态成员函数/变量
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- C++未使用的变量警告,即使我在函数结束时返回它
- 是否需要删除函数中未使用的新结构?
- 具有未使用的模板参数的函数模板
- 来自重载或模板化函数的额外未使用代码的影响?
- DLL 链接静态库 - 未使用函数中未解析的链接器符号
- 使用递归的函数未按预期工作
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- 拥有这个未使用的函数 Init 有什么意义
- 尝试使用 std::函数(未定义的符号)声明模板化类状态时出现链接错误
- int类型的函数未使用返回C++
- 函数未使用与类相同的名称调用
- 编译器会优化出静态函数未使用的参数吗?