使用OpenSSL时如何检测内存泄漏

时间:2018-12-03 12:05:31

标签: visual-studio-2015 openssl

我正在开发一些模块,以在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

1 个答案:

答案 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库。