Skip to content

Commit 8bcfcc0

Browse files
KevinEadyMoLow
authored andcommitted
doc: add valgrind suppression details
PR-URL: #47760 Reviewed-By: Michael Dawson <midawson@redhat.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent 95972aa commit 8bcfcc0

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

doc/contributing/investigating-native-memory-leaks.md

+103
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,109 @@ allocated. This is because by default the addon is compiled without
320320
the debug symbols which Valgrind needs to be able to provide more
321321
information.
322322

323+
It is possible to hide leaks related to Node.js itself in future Valgrind runs
324+
using the suppression feature of Valgrind.
325+
326+
## Generating a Valgrind suppression file
327+
328+
Valgrind uses suppression files to hide issues found from the summary. Generate
329+
a log file with embedded suppressions using the `--gen-suppressions` and
330+
`--log-file` flags:
331+
332+
```bash
333+
valgrind --leak-check=full \
334+
--gen-suppressions=all \
335+
--log-file=./valgrind-out.txt \
336+
node hello.js
337+
```
338+
339+
Valgrind will save the output to the log file specified. After each heap in the
340+
summary, Valgrind will include a suppression record: a structure that Valgrind
341+
can use to ignore specific memory issues. Suppression records can be saved to a
342+
suppression file which Valgrind can use in subsequent executions to hide various
343+
memory errors. This is an example of the suppression records from the previous
344+
call:
345+
346+
```text
347+
{
348+
<insert_a_suppression_name_here>
349+
Memcheck:Value8
350+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
351+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
352+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
353+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
354+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
355+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
356+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
357+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
358+
obj:/home/kevin/.nvm/versions/node/v12.14.1/bin/node
359+
fun:_ZN2v88internal12_GLOBAL__N_16InvokeEPNS0_7IsolateERKNS1_12InvokeParamsE
360+
fun:_ZN2v88internal9Execution4CallEPNS0_7IsolateENS0_6HandleINS0_6ObjectEEES6_iPS6_
361+
fun:_ZN2v88Function4CallENS_5LocalINS_7ContextEEENS1_INS_5ValueEEEiPS5_
362+
}
363+
{
364+
<insert_a_suppression_name_here>
365+
Memcheck:Leak
366+
match-leak-kinds: definite
367+
fun:_Znwm
368+
fun:napi_module_register
369+
fun:call_init.part.0
370+
fun:call_init
371+
fun:_dl_init
372+
fun:_dl_catch_exception
373+
fun:dl_open_worker
374+
fun:_dl_catch_exception
375+
fun:_dl_open
376+
fun:dlopen_doit
377+
fun:_dl_catch_exception
378+
fun:_dl_catch_error
379+
fun:_dlerror_run
380+
}
381+
{
382+
<insert_a_suppression_name_here>
383+
Memcheck:Leak
384+
match-leak-kinds: possible
385+
fun:calloc
386+
fun:allocate_dtv
387+
fun:_dl_allocate_tls
388+
fun:allocate_stack
389+
fun:pthread_create@@GLIBC_2.2.5
390+
fun:_ZN4node9inspector5Agent5StartERKSsRKNS_12DebugOptionsESt10shared_ptrINS_8HostPortEEb
391+
fun:_ZN4node11Environment19InitializeInspectorESt10unique_ptrINS_9inspector21ParentInspectorHandleESt14default_deleteIS3_EE
392+
fun:_ZN4node16NodeMainInstance21CreateMainEnvironmentEPi
393+
fun:_ZN4node16NodeMainInstance3RunEv
394+
fun:_ZN4node5StartEiPPc
395+
fun:(below main)
396+
}
397+
```
398+
399+
Create a file (eg. `node-12.14.1.supp`) with the contents of the suppression
400+
records, and run Valgrind with the suppression file previously created:
401+
402+
```bash
403+
valgrind --leak-check=full \
404+
--suppressions=./node-12.14.1.supp \
405+
node hello.js
406+
```
407+
408+
Now, the Valgrind leak summary for suppressed issues are only mentioned as
409+
`suppressed` in the leak summary:
410+
411+
```console
412+
==12471== HEAP SUMMARY:
413+
==12471== in use at exit: 8,067 bytes in 31 blocks
414+
==12471== total heap usage: 16,482 allocs, 16,451 frees, 17,255,689 bytes allocated
415+
==12471==
416+
==12471== LEAK SUMMARY:
417+
==12471== definitely lost: 0 bytes in 0 blocks
418+
==12471== indirectly lost: 0 bytes in 0 blocks
419+
==12471== possibly lost: 0 bytes in 0 blocks
420+
==12471== still reachable: 7,699 bytes in 29 blocks
421+
==12471== of which reachable via heuristic:
422+
==12471== multipleinheritance: 48 bytes in 1 blocks
423+
==12471== suppressed: 368 bytes in 2 blocks
424+
```
425+
323426
## Enabling debug symbols to get more information
324427

325428
Leaks may be either in addons or Node.js itself. The sections which

0 commit comments

Comments
 (0)