On Saturday, 3 July 2021 at 22:52:39 UTC, frame wrote:
>On Saturday, 3 July 2021 at 22:04:04 UTC, Luis wrote:
>scope(exit) it's syntactic sugar for a classic try {} finally {}
. The documentation says that must be executed.
It works if you replace printf() with writeln() or use writeln() after. There must be some buffer issue.
Not works as you expected.
Yes, replacing by writeln (better said, putting a writeln) makes it to work. More weird, if I replace the printf(...) by a fprintf(stderr, ...), I don't get anything.
To discard depening on checking if it works by the side effect of writing something on the console, now i using malloc/free and checking with valgrind for a lost memory :
#!/usr/bin/env dub
/+ dub.sdl:
dependency "pijamas" version="~>1.1"
+/
import core.exception;
import core.stdc.stdio;
import core.stdc.stdlib;
import std.stdio : writeln;
void main() {
import pijamas;
should(() {
int* ptr = cast(int*) malloc(int.sizeof * 1000);
try {
fprintf(stderr, "Hello\n");
throw new RangeError("bla bla");
} finally {
// writeln("Bye 1");
fprintf(stderr, "Bye\n");
free(ptr);
}
}).Throw!RangeError;
}
Outputs this :
$ f.d
Hello
And valgrind outputs (using the temporal executable generated by dub on /tmp/.dub/...) :
$ valgrind --leak-check=full /tmp/.dub/build/f-\~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f
==18356== Memcheck, a memory error detector
==18356== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==18356== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==18356== Command: /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f
==18356==
--18356-- WARNING: Serious error when reading debug info
--18356-- When reading debug info from /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f:
--18356-- DWARF line info appears to be corrupt - the section is too small
--18356-- WARNING: Serious error when reading debug info
--18356-- When reading debug info from /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f:
--18356-- read_filename_table: .debug_line is missing?
Hello
==18356==
==18356== HEAP SUMMARY:
==18356== in use at exit: 4,056 bytes in 3 blocks
==18356== total heap usage: 231 allocs, 228 frees, 76,436 bytes allocated
==18356==
==18356== 32 bytes in 1 blocks are possibly lost in loss record 2 of 3
==18356== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind
....
==18356== 4,000 bytes in 1 blocks are definitely lost in loss record 3 of 3
==18356== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==18356== by 0x16873D: _D1f4mainFZ9__lambda1FNbZv (f.d:15)
==18356== by 0x168B2F: _D7pijamas9assertion__T9AssertionTPFNbZvZQs__T5ThrowHTC4core9exception10RangeErrorZQBlMFNeAyamZv (assertion.d:602)
==18356== by 0x168724: _Dmain (assertion.d:598)
==18356== by 0x18C962: _D2rt6dmain212_d_run_main2UAAamPUQgZiZ6runAllMFZ9__lambda2MFZv (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x18C804: _D2rt6dmain212_d_run_main2UAAamPUQgZiZ7tryExecMFMDFZvZv (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x18C8DE: _D2rt6dmain212_d_run_main2UAAamPUQgZiZ6runAllMFZv (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x18C804: _D2rt6dmain212_d_run_main2UAAamPUQgZiZ7tryExecMFMDFZvZv (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x18C765: _d_run_main2 (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x18C4C1: _d_run_main (in /tmp/.dub/build/f-~master/application-debug-linux.posix-x86_64-dmd_2097-FB7AFBA927D99FA3DDD7307BACA865DA/f)
==18356== by 0x1687B9: main (entrypoint.d:29)
==18356==
==18356== LEAK SUMMARY:
==18356== definitely lost: 4,000 bytes in 1 blocks
==18356== indirectly lost: 0 bytes in 0 blocks
==18356== possibly lost: 32 bytes in 1 blocks
==18356== still reachable: 24 bytes in 1 blocks
==18356== suppressed: 0 bytes in 0 blocks
==18356== Reachable blocks (those to which a pointer was found) are not shown.
==18356== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==18356==
==18356== For lists of detected and suppressed errors, rerun with: -s
==18356== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
But the most funny thing, it's that if I remove the comment on the writeln, then just works and the memory leak dissapers! DMD , it's doing very weird things here, only executing the scope (exit) {} / finally {} when there is a side effect with writeln !
This not happens with my local install of ldc2.
On my original post, I was just searching for a memory leak on a tests of my private library, where I have some @nogc containers using std.experimental.allocator, and expecting that the scope (exit) being executed and releasing the allocated memory. And this wasn't happening.
dmd --version :
DMD64 D Compiler v2.097.0
ldc2 -v :
binary /usr/bin/ldc2
version 1.20.1 (DMD v2.090.1, LLVM 10.0.0)
config /etc/ldc2.conf (x86_64-pc-linux-gnu)