我正在开发一些模块,以在Linux中使用c ++验证签名。 而且,我正在Visual Studio 2015中对其进行测试和调试。 但是,对于内存泄漏测试,我不知道如何检测它。
首先,我尝试使用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
答案 0 :(得分:2)
摘自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()函数。
更一般地说,the Visual Studio debugger and C Run-time Library (CRT) can help you detect and identify memory leaks。我认为这是最好的起点。从头到尾阅读该页面将为您提供许多工具来解决内存泄漏问题。
要获得全面的了解,逐步了解OpenSSL代码并获得完整的调试功能,最好是在启用调试的情况下(如果尚未这样做)在本地重建OpenSSL库。