Hi Matthias,
It looks good in general but I have some minor comments below.
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.agent/linux/native/libsaproc/symtab.c.frames.html
279 build_id_to_debug_filename (size_t size, unsigned char *data)
280 {
. . .
283 filename = malloc(strlen (debug_file_directory) + (sizeof
"/.build-id/" - 1) + 1
284 + 2 * size + (sizeof ".debug" - 1) + 1);
285 if (filename == NULL) {
286 return NULL;
287 }
. . .
312 char *filename
313 = (build_id_to_debug_filename (note->n_descsz, bytes));
314 if (filename == NULL) {
315 return NULL;
316 }
There is no need to check filename for NULL at the line 314 as the function
build_id_to_debug_filename with new check at the line 285 never returns
NULL.
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.agent/macosx/native/libsaproc/MacosxDebuggerLocal.m.frames.html
354 array = (*env)->NewByteArray(env, numBytes);
. . .
376 if (pages == NULL) {
377 return NULL;
378 }
379 mapped = calloc(pageCount, sizeof(int));
380 if (mapped == NULL) {
381 free(pages);
382 return NULL;
383 }
Just a question:
We do not release the array allocated at line 354 because this local
reference
will be auto-released when returning to Java. Is this correct?
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.agent/macosx/native/libsaproc/symtab.c.frames.html
69 if (is_debug()) {
70 DBT rkey, rvalue; 71 char* tmp = (char
*)malloc(strlen(symtab->symbols[i].name) + 1);
72 if (tmp != NULL) {
73 strcpy(tmp, symtab->symbols[i].name);
74 rkey.data = tmp;
75 rkey.size = strlen(tmp) + 1;
76 (*symtab->hash_table->get)(symtab->hash_table, &rkey, &rvalue, 0);
77 // we may get a copy back so compare contents
78 symtab_symbol *res = (symtab_symbol *)rvalue.data;
79 if (strcmp(res->name, symtab->symbols[i].name) ||
80 res->offset != symtab->symbols[i].offset ||
81 res->size != symtab->symbols[i].size) {
82 print_debug("error to get hash_table value!\n");
83 }
84 free(tmp);
85 }
If malloc returns NULL then this debugging part will be we silently skipped.
In other such cases there is an attempt to print a debug message.
For instance:
140 symtab = (symtab_t *)malloc(sizeof(symtab_t));
141 if (symtab == NULL) {
142 print_debug("out of memory: allocating symtab\n");
143 return NULL;
144 }
I understand that print_debug can fail with out of memory as well.
But it depends on its implementation.
Thanks,
Serguei
On 9/4/19 00:28, Baesken, Matthias wrote:
Hello Yasumasa and Chris, thanks for your input .
Here is a new webrev , without the unneeded memset-calls after calloc .
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/
Hope everyone is happy with this now 😉 !
Best regards, Matthias
Hi Matthias,
src/jdk.hotspot.agent/linux/native/libsaproc/symtab.c:
```
405 // guarantee(symtab == NULL, "multiple symtab");
406 symtab = (struct symtab*)calloc(1, sizeof(struct symtab));
407 if (symtab == NULL) {
408 goto quit;
409 }
410 memset(symtab, 0, sizeof(struct symtab));
```
Why do you call memset() to clear symtab in L410?
symtab is allocated via calloc() in L406, so symtab would already cleared.
Thanks,
Yasumasa (ysuenaga)
On 2019/09/03 18:14, David Holmes wrote:
Hi Matthias,
Re-directing to serviceability-dev.
David
On 3/09/2019 5:42 pm, Baesken, Matthias wrote:
Hello, please review the following small fix .
In jdk.hotspot.agent native code (linux / macosx) we miss to check the
result of malloc/calloc a few times .
This should be adjusted.
Additionally I added initialization to the symtab array in symtab.c (by
calling memset to make sure we have a defined state ) .
One question (was not really sure about this one so I did not change it so
far) :
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.0/src/jdk.hotspot.
agent/macosx/native/libsaproc/symtab.c.frames.html
359 void destroy_symtab(symtab_t* symtab) {
360 if (!symtab) return;
361 free(symtab->strs);
362 free(symtab->symbols);
363 free(symtab);
364 }
Here we miss to close symtab->hash_table (opened by dbopen) , is it
needed (haven't used dbopen much - maybe someone can comment on
this)?
bug/webrev :
https://bugs.openjdk.java.net/browse/JDK-8230466
http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.0/
Thanks and best regards, Matthias