有没有办法通过改变Linux中的任何操作系统参数来慢慢运行C++程序?通过这种方式,我想模拟如果特定程序碰巧在真正较慢的机器上运行会发生什么.
换句话说,更快的机器应该表现为该特定程序的较慢机器.
我正在为C写一个内存分析器,因为它拦截了对mall的调用malloc,realloc并free通过malloc_hooks 来调用函数.不幸的是,由于它们在多线程环境中的不良行为而被弃用.我找不到描述替代最佳实践解决方案的文档来实现同样的事情,有人可以启发我吗?
我已经读过一个简单的#define malloc(s) malloc_hook(s)方法可以解决这个问题,但是这对我想到的系统设置不起作用,因为它太过于干扰原始代码库,不适合在分析/跟踪工具中使用.必须手动更改原始应用程序代码是任何体面的分析器的杀手.最理想的是,我要寻找的解决方案只需链接到可选的共享库即可启用或禁用.例如,我当前的设置使用声明的函数__attribute__ ((constructor))来安装拦截malloc挂钩.
谢谢
我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.
约束:
我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.
以下是我考虑的工具/方法
我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?
我必须测试一个提供自己的内存分配例程的库:
void* allocation_routine(size_t size) throw();
Run Code Online (Sandbox Code Playgroud)
文档指出该函数至少分配大小字节的内存(允许分配更多字节)。顺便说一下,该函数在内部使用posix_memalign,但是实现可能会发生变化。
我想知道是否可以为这种功能编写单元测试?我们如何测试是否分配了所需的内存量?
更新:
如果我们不能编写单元测试,那么最接近的解决方案是什么?
我试图通过这样做来覆盖malloc.
#define malloc(X) my_malloc((X))
void* my_malloc(size_t size)
{
void *p = malloc(size);
printf ("Allocated = %s, %s, %s, %x\n",__FILE__, __LINE__, __FUNCTION__, p);
return p;
}
Run Code Online (Sandbox Code Playgroud)
但是,这是无限期地递归调用my_malloc(因为my_malloc中的malloc调用).我想在my_malloc中调用C malloc函数而不是宏实现.你能告诉我怎么做吗?
谢谢.
我希望能够检查是否可以在Linux上打开文件(用于读取或读取和写入).但是我无法控制将打开文件的代码,所以我不能做我通常做的事情,即打开它然后处理错误.
我感谢在调用返回之后但在打开调用之前由于权限更改而在任何检查上始终存在竞争条件,但我正在尝试避免从我无法控制的库中记录某些不需要的错误.
我知道stat,但我不想尝试复制检查用户ID和组ID的逻辑.
我正在尝试拦截来自 pytorch 库的 cudaMemcpy 调用以进行分析。我注意到 NVIDIA 在 CUDA 工具包示例中有一个 cuHook 示例。然而,该示例需要修改应用程序本身的源代码,在这种情况下我无法做到这一点。那么有没有一种方法可以在不修改应用程序源代码的情况下编写一个钩子来拦截CUDA调用呢?
c ×7
c++ ×5
linux ×4
malloc ×2
cuda ×1
deprecated ×1
free ×1
gcc ×1
glibc ×1
interceptor ×1
pytorch ×1
ubuntu ×1
unit-testing ×1
unix ×1
valgrind ×1