我正在开发一些模块来验证在linux中使用c++进行签名。而且,我正在visualstudio2015中测试和调试它。但是,对于内存泄漏测试,我不知道如何检测它
首先,我尝试使用vld.h和crtdbg.h,它们都无法检测到像Bio*这样的openssl元素内存泄漏。或X509*。是否有其他工具可以支持检测openssl元素的内存泄漏??
当然,我试着使用"int CRYPTO_mem_leaks(Bio*(",但它被定义为下面这样的评论,在visual studio中,我不知道如何让它们活跃起来。类似:
# ifndef OPENSSL_NO_CRYPTO_MDEBUG
# define OPENSSL_mem_debug_push(info)
CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE)
# define OPENSSL_mem_debug_pop()
CRYPTO_mem_debug_pop()
int CRYPTO_mem_debug_push(const char *info, const char *file, int
line);
int CRYPTO_mem_debug_pop(void);
void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount);
/*-
* Debugging functions (enabled by CRYPTO_set_mem_debug(1))
* The flag argument has the following significance:
* 0: called before the actual memory allocation has taken place
* 1: called after the actual memory allocation has taken place
*/
void CRYPTO_mem_debug_malloc(void *addr, size_t num, int flag,
const char *file, int line);
void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, size_t num,
int flag,
const char *file, int line);
void CRYPTO_mem_debug_free(void *addr, int flag,
const char *file, int line);
int CRYPTO_mem_leaks_cb(int (*cb) (const char *str, size_t len, void *u),
void *u);
# ifndef OPENSSL_NO_STDIO
int CRYPTO_mem_leaks_fp(FILE *);
# endif
int CRYPTO_mem_leaks(BIO *bio);
# endif
来自CRYPTO_set_mem_functions((的文档:
如果没有进行分配,则可以"交换"OPENSSL_malloc((、OPENSSL_realloc和OPENSSL_free((,并将其替换为备用版本(钩子(。CRYPTO_get_mem_functions((函数用当前实现的函数指针。具有CRYPTO_set_mem_functions((,您可以指定一组不同的功能。如果m、r或f中的任何一个为NULL,则该函数不是已更改。
您可以使用此机制插入自己的内存分配跟踪函数,或者在某些情况下怀疑存在某些问题时使用断点。在执行Windows操作时,可以从这些钩子内部调用_malloc_dbg((、_realloc_dbg(和_free_dbg((函数。
更一般地说,VisualStudio调试器和C运行时库(CRT(可以帮助您检测和识别内存泄漏。在我看来,这是最好的起点。从头到尾阅读该页面将为您提供许多工具来解决内存泄漏问题。
要获得完整的见解,请逐步了解OpenSSL代码并获得完整的调试功能,最好在启用调试的情况下在本地重建OpenSSL库(如果您还没有这样做(。