在使用跟踪时,我发现一些函数没有在源代码中列出,而试图找到它们以便放置断点。这些功能似乎只有在我以汇编格式查看源代码时才会出现。
我和我的前辈谈过,他们告诉我如果任何函数只被调用一次,它将被 Trace 优化并显示为内联,因此可以在汇编中看到。
我的问题是:
- 这种优化是如何通过劳特巴赫发生的?
- 这有好处吗??
有几件事:
关于声明,我发现源代码中没有列出一些函数,同时试图找到它们以放置断点“,只需检查包含构建中使用的不同函数的映射文件/映射文件,它们的位置在内存等中,如果您在那里找不到您的功能,而不仅仅是查看优化[只有这可能是问题]。
正如正确指出的那样,优化不是由劳特巴赫完成的,而是由编译器完成的。通常,有不同的优化级别[在 ARM 中,我们有 O0-O2],其中 O0 是可能的最高优化,但这仅应在向客户发布版本时使用,否则优化级别 O2 应用于调试。
如果您觉得该函数可能会被编译器优化,请尝试将其设为volatile。
可能与此[直接]不相关但可能有帮助的另一点是知道“您的文件位于内存的哪个区域”,因为很多时候,当您想要调试某些东西并且该页面仍然不在RAM中时,您将无法设置断点,直到该页面进入 RAM [基本上,如果系统中存在按需分页,则类似于按需分页]
希望这可以帮助。
-hjsblogger
优化由编译器完成,而不是劳特巴赫。编译器尝试优化其汇编语言输出,默认设置通常会内联只调用一次的函数。
要覆盖这些优化以进行测试,您可以使用编译器标志--no_inline。
如果在源代码中找不到调用的函数,则不太可能是因为内联函数,原因有两个:
内联函数调用不会在汇编代码中显示为子例程调用 - 实现函数的代码在函数调用的位置内联发出(这就是内联)
当编译器内联您的函数调用时,函数名称(如果您可以在程序集输出中看到它)仍将是您的源代码的一部分 - 这就是编译器将代码内联的地方。
但是,编译器有时会在生成的代码中插入对内部辅助函数的神秘函数调用,以实现 CPU 不直接支持的算术运算(例如整数除法或浮点运算)。
“神秘功能”的名称是什么?
编译器可以内联只调用一次的函数。
优点是它节省了函数调用的开销(运行时、代码空间和堆栈空间),并且您仍然可以以良好的模块化方式将代码编写为多个函数。
缺点是调试变得更加困难,因为在调试过程中函数与调用者混淆了。
Wrt 你的跟踪工具的行为你的问题还不清楚。