如何在makefile中使用dmalloc?

hxzsmxv2  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(210)

我使用来自vscode的WSL2进行开发和构建,但我是一个Linux新手用户。我目前正在用C进行开发,并使用unity进行单元测试和dmalloc检查内存使用是否正确。
按照dmalloc文档here,一旦安装了库,必须为dmalloc创建一个别名,以便可以从命令行配置它。我在.bashrc文件中使用此选项来创建别名:

function dmalloc { eval `command dmalloc -b $*`; }

在运行使用dmalloc库编译的程序之前,必须告诉dmalloc将结果放入日志文件中,如下所示:

dmalloc -l logfile -i 100 low

在shell中输入命令时,这一切都很好。然而,我的单元测试是从make文件中逐个运行的。我希望dmalloc将其结果输出到每个单元测试的特定日志文件中。然而,由于使用别名来配置dmalloc,并且make不会扩展别名,因此无法在每个单元测试运行之前配置dmalloc。
下面是一个例子,我想如何从我的make文件运行单元测试:

DIR_BUILD_TESTS := $(DIR_BUILD)tests/
TXT_TESTS := $(patsubst $(DIR_BUILD_TESTS)%.o,$(DIR_BUILD_TESTS)%.txt,$(OBJ_TESTS))

test: $(TXT_TESTS)
    @echo "-----------------------\nPASSED:\n-----------------------"
    @echo "$(PASSED)"
    @echo "-----------------------\nIGNORES:\n-----------------------"
    @echo "$(IGNORE)"
    @echo "-----------------------\nFAILURES:\n-----------------------"
    @echo "$(FAIL)"
    @echo "DONE"

$(DIR_BUILD_TESTS)%.txt: $(DIR_BUILD_TESTS)%.exe
    dmalloc -l $(subst .txt,.log,$@) -i 100 low
    -./$< > $@ 2>&1

默认目标是“test”,它只输出单元测试的结果。然而,test的先决条件是包含测试输出的文本文件,test后的规则运行每个构建的.exe文件并将其结果输出到文本文件。这是从unity documentation的makefile示例改编而来的。正如您所看到的,我想在运行每个测试之前配置dmalloc,以便每个测试都有一个与之关联的dmalloc日志文件。但这不起作用,下面是当前输出的示例:

dmalloc -l ../../build/debug/tests/testNumberOne.log -i 100 low
export DMALLOC_OPTIONS=debug=0x4e48503,inter=100,log=../../build/debug/tests/testNumberOne.log
./../../build/debug/tests/testNumberOne.exe > ../../build/debug/tests/testNumberOne.txt 2>&1

根据dmalloc文档,如果输出中显示“DMALLOC_OPTIONS”,则别名不会生效。这是我们所期望的,因为我们知道make不会扩展别名。
那么有没有办法得到我想要的功能呢?

2ic8powd

2ic8powd1#

这可以通过在运行每个单元测试之前使用不同的方法来配置dmalloc来解决。您可以在执行每个单元测试命令时将所需的选项直接传递到dmalloc中。
示例:

DIR_BUILD_TESTS := $(DIR_BUILD)tests/
TXT_TESTS := $(patsubst $(DIR_BUILD_TESTS)%.o,$(DIR_BUILD_TESTS)%.txt,$(OBJ_TESTS))

test: $(TXT_TESTS)
@echo "-----------------------\nPASSED:\n-----------------------"
@echo "$(PASSED)"
@echo "-----------------------\nIGNORES:\n-----------------------"
@echo "$(IGNORE)"
@echo "-----------------------\nFAILURES:\n-----------------------"
@echo "$(FAIL)"
@echo "DONE"

$(DIR_BUILD_TESTS)%.txt: $(DIR_BUILD_TESTS)%.exe
DMALLOC_OPTIONS="debug=0x4e48503,inter=100,log=$(subst .txt,.log,$@)" dmalloc -l $(subst .txt,.log,$@) -i 100 low ./$(subst .exe,,$<) > $@ 2>&1

此修改包括将DMALLOC_OPTIONS环境变量设置为每个单元测试命令所需的选项。此变量可以在执行单元测试命令之前作为参数传递给dmalloc命令。在上面的示例中,DMALLOC_OPTIONS变量设置为所需的选项,并在执行单元测试命令之前传递给dmalloc命令。
此修改可确保在执行每个单元测试之前使用所需选项配置dmalloc,并将结果输出到与每个单元测试关联的特定日志文件。
希望我能帮上忙。

相关问题