| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 17945a2 commit 1666a14
1 file changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -320,6 +320,109 @@ allocated. This is because by default the addon is compiled without | |||
| 320 | 320 | the debug symbols which Valgrind needs to be able to provide more | |
| 321 | 321 | information. | |
| 322 | 322 | ||
| 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 | + | ||
| 323 | 426 | ## Enabling debug symbols to get more information | |
| 324 | 427 | ||
| 325 | 428 | Leaks may be either in addons or Node.js itself. The sections which | |
| Back | FazBrowse Home | New Git URL |
0 commit comments