相关疑难解决方法(0)

让程序运行缓慢

有没有办法通过改变Linux中的任何操作系统参数来慢慢运行C++程序?通过这种方式,我想模拟如果特定程序碰巧在真正较慢的机器上运行会发生什么.

换句话说,更快的机器应该表现为该特定程序的较慢机器.

c c++ unix linux ubuntu

102
推荐指数
4
解决办法
1万
查看次数

glibc弃用的__malloc_hook功能的替代方案

我正在为C写一个内存分析器,因为它拦截了对mall的调用malloc,reallocfree通过malloc_hooks 来调用函数.不幸的是,由于它们在多线程环境中的不良行为而被弃用.我找不到描述替代最佳实践解决方案的文档来实现同样的事情,有人可以启发我吗?

我已经读过一个简单的#define malloc(s) malloc_hook(s)方法可以解决这个问题,但是这对我想到的系统设置不起作用,因为它太过于干扰原始代码库,不适合在分析/跟踪工具中使用.必须手动更改原始应用程序代码是任何体面的分析器的杀手.最理想的是,我要寻找的解决方案只需链接到可选的共享库即可启用或禁用.例如,我当前的设置使用声明的函数__attribute__ ((constructor))来安装拦截malloc挂钩.

谢谢

c malloc gcc glibc deprecated

33
推荐指数
1
解决办法
1万
查看次数

Linux上的轻量级内存泄漏调试

我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.

约束:

  • 泄漏仅在客户的环境中重现.由于某些法律限制,我们必须使用现有的二进制文件.没有重建.
  • 在常规环境中,我们的应用程序消耗大约10%的CPU.说,我们可以容忍高达10倍的CPU使用量增加.使用默认memcheck 设置的Valgrind会使我们的应用程序长时间无响应.

我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.

以下是我考虑的工具/方法

  • Valgrind-memcheck-massif工具它们做的远远超过了需要(比如为每个分配指针扫描整个进程内存),它们太慢了,它们仍然没有完全按照我的
    需要执行(转储按计数排序的callstack) ,所以我将编写一些解析输出的脚本
  • dmalloc库(dmalloc.com)需要新的二进制文件
  • LeakTracer(http://www.andreasen.org/LeakTracer/)仅适用于C++ new/delete(我也需要malloc/free),没有逐个堆栈和排序功能
  • 使用LD_PRELOAD机制将自己实现为.so库(使用LD_PRELOAD机制覆盖'malloc')至少需要一周的时间,因为我的Linux编码技能,并且感觉就像发明了一辆自行车.

我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?

c c++ linux valgrind

17
推荐指数
4
解决办法
2万
查看次数

我们可以对内存分配进行单元测试吗?

我必须测试一个提供自己的内存分配例程的库:

void* allocation_routine(size_t size) throw();
Run Code Online (Sandbox Code Playgroud)

文档指出该函数至少分配大小字节的内存(允许分配更多字节)。顺便说一下,该函数在内部使用posix_memalign,但是实现可能会发生变化。

我想知道是否可以为这种功能编写单元测试?我们如何测试是否分配了所需的内存量?

更新:

如果我们不能编写单元测试,那么最接近的解决方案是什么?

c c++ linux unit-testing memory-management

14
推荐指数
1
解决办法
957
查看次数

覆盖malloc的问题

我试图通过这样做来覆盖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函数而不是宏实现.你能告诉我怎么做吗?

谢谢.

c c++

10
推荐指数
4
解决办法
9830
查看次数

有没有办法覆盖C语言中的malloc / free函数?

有没有办法从自身的C应用程序挂接malloc / free函数调用?

c malloc free

5
推荐指数
3
解决办法
5414
查看次数

如何在没有在C中的Linux上打开文件的情况下检查我是否有权打开文件?

我希望能够检查是否可以在Linux上打开文件(用于读取或读取和写入).但是我无法控制将打开文件的代码,所以我不能做我通常做的事情,即打开它然后处理错误.

我感谢在调用返回之后但在打开调用之前由于权限更改而在任何检查上始终存在竞争条件,但我正在尝试避免从我无法控制的库中记录某些不需要的错误.

我知道stat,但我不想尝试复制检查用户ID和组ID的逻辑.

c linux

3
推荐指数
1
解决办法
1328
查看次数

拦截 CUDA 调用

我正在尝试拦截来自 pytorch 库的 cudaMemcpy 调用以进行分析。我注意到 NVIDIA 在 CUDA 工具包示例中有一个 cuHook 示例。然而,该示例需要修改应用程序本身的源代码,在这种情况下我无法做到这一点。那么有没有一种方法可以在不修改应用程序源代码的情况下编写一个钩子来拦截CUDA调用呢?

c++ cuda interceptor pytorch

1
推荐指数
1
解决办法
1266
查看次数