gpt4 book ai didi

c++ - 通过clang++的-finstrument-functions : how to ignore internal std library calls?进行C++功能检测

转载 作者:行者123 更新时间:2023-12-01 14:07:35 33 4
gpt4 key购买 nike

假设我有一个类似的功能:

template<typename It, typename Cmp>
void mysort( It begin, It end, Cmp cmp )
{
std::sort( begin, end, cmp );
}
当我使用 -finstrument-functions-after-inliningclang++ --version进行编译时:
clang version 11.0.0 (...)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: ...
仪器代码激增了执行时间,因为每次调用都会调用我的进入和退出函数
void std::__introsort_loop<...>(...)
void std::__move_median_to_first<...>(...)
我正在对一个非常大的数组进行排序,所以我的程序无法完成:没有检测,它大约需要10秒,而使用检测,我已经在10分钟时取消了它。
我尝试将 __attribute__((no_instrument_function))添加到 mysort(以及调用 mysort的函数)中,但是就这些标准库调用而言,这似乎没有效果。
有谁知道是否可以忽略 std::sort等标准库函数内部的函数检测?理想情况下,我只会检测 mysort,因此只有一个入口和一个导出!
我看到 clang++可悲的是尚不支持 finstrument-functions-exclude-function-listfinstrument-functions-exclude-file-list之类的东西,但 g++尚不支持理想情况下的 -finstrument-functions-after-inlining,所以我被卡住了!
编辑:播放更多之后,似乎对执行时间的影响实际上比描述的要少,所以这不是世界末日。但是问题仍然存在,因为大多数使用 clang进行功能检测的人只会关心应用程序代码,而不关心那些从(例如)标准库链接的函数。
EDIT2:现在我要在一个合理的时间范围内运行它,以便进一步突出该问题:我使用这两个标准库函数从检测代码生成的结果跟踪为15GB。当我对跟踪进行硬编码以忽略这两个函数地址时,结果跟踪为3.7MB!

最佳答案

我遇到了同样的问题。似乎曾经提议过对这些标志的支持,但从未合并到主分支中。
https://reviews.llvm.org/D37622
这不是直接的答案,因为该工具不支持您要执行的操作,但是我认为我有一个不错的解决方法。我最后要做的是创建各种“跳过列表”。在已检测的函数(__cyg_profile_func_enter__cyg_profile_func_exit)中,我想对打印时间影响最大​​的部分是打印。如果您想出一种使配置文件功能短路的方法,则即使不是最理想的方法也应有所帮助。至少它将限制输出文件的大小。
就像是

#include <stdint.h>

uintptr_t skipAddrs[] = {
// assuming 64-bit addresses
0x123456789abcdef, 0x2468ace2468ace24
};
size_t arrSize = 0;

int main(void)
{
...

arrSize = sizeof(skipAddrs)/sizeof(skipAddrs[0]);
// https://stackoverflow.com/a/37539/12940429

...
}

void __cyg_profile_func_enter (void *this_fn, void *call_site) {
for (size_t idx = 0; idx < arrSize; idx++) {
if ((uintptr_t) this_fn == skipAddrs[idx]) {
return;
}
}
}
我使用 objdump -t binaryFile之类的东西来检查符号表,并找到每个函数的地址。
如果您特别想忽略库调用,则可能有用的方法是在链接库之前检查目标文件的符号表,然后忽略最终二进制文件中所有出现的新符号。
所有这些都应该可以通过 grepawkpython这样的东西来实现。

关于c++ - 通过clang++的-finstrument-functions : how to ignore internal std library calls?进行C++功能检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63000336/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com