8017478: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites

Tue, 25 Jun 2013 17:22:04 -0400

author
zgu
date
Tue, 25 Jun 2013 17:22:04 -0400
changeset 5325
8cff1de240de
parent 5306
d9eed26d638a
child 5326
c14867f95c60

8017478: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites
Summary: Fixed possible NULL pointer that caused SIGSEGV
Reviewed-by: coleenp, acorn, ctornqvi

src/share/vm/services/memReporter.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/services/memReporter.cpp	Sun Jun 23 22:08:28 2013 -0700
     1.2 +++ b/src/share/vm/services/memReporter.cpp	Tue Jun 25 17:22:04 2013 -0400
     1.3 @@ -188,8 +188,8 @@
     1.4                    (MallocCallsitePointer*)prev_malloc_itr.current();
     1.5  
     1.6    while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) {
     1.7 -    if (prev_malloc_callsite == NULL ||
     1.8 -        cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) {
     1.9 +    if (prev_malloc_callsite == NULL) {
    1.10 +      assert(cur_malloc_callsite != NULL, "sanity check");
    1.11        // this is a new callsite
    1.12        _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
    1.13          amount_in_current_scale(cur_malloc_callsite->amount()),
    1.14 @@ -197,22 +197,42 @@
    1.15          diff_in_current_scale(cur_malloc_callsite->amount(), 0),
    1.16          diff(cur_malloc_callsite->count(), 0));
    1.17        cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
    1.18 -    } else if (cur_malloc_callsite == NULL ||
    1.19 -               cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) {
    1.20 +    } else if (cur_malloc_callsite == NULL) {
    1.21 +      assert(prev_malloc_callsite != NULL, "Sanity check");
    1.22        // this callsite is already gone
    1.23        _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
    1.24 -        amount_in_current_scale(0), 0,
    1.25 +        0, 0,
    1.26          diff_in_current_scale(0, prev_malloc_callsite->amount()),
    1.27          diff(0, prev_malloc_callsite->count()));
    1.28        prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
    1.29 -    } else {  // the same callsite
    1.30 -      _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
    1.31 -        amount_in_current_scale(cur_malloc_callsite->amount()),
    1.32 -        cur_malloc_callsite->count(),
    1.33 -        diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()),
    1.34 -        diff(cur_malloc_callsite->count(), prev_malloc_callsite->count()));
    1.35 -      cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
    1.36 -      prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
    1.37 +    } else {
    1.38 +      assert(cur_malloc_callsite  != NULL,  "Sanity check");
    1.39 +      assert(prev_malloc_callsite != NULL,  "Sanity check");
    1.40 +      if (cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) {
    1.41 +        // this is a new callsite
    1.42 +        _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
    1.43 +          amount_in_current_scale(cur_malloc_callsite->amount()),
    1.44 +          cur_malloc_callsite->count(),
    1.45 +          diff_in_current_scale(cur_malloc_callsite->amount(), 0),
    1.46 +          diff(cur_malloc_callsite->count(), 0));
    1.47 +          cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
    1.48 +      } else if (cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) {
    1.49 +        // this callsite is already gone
    1.50 +        _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(),
    1.51 +          0, 0,
    1.52 +          diff_in_current_scale(0, prev_malloc_callsite->amount()),
    1.53 +          diff(0, prev_malloc_callsite->count()));
    1.54 +        prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
    1.55 +      } else {
    1.56 +        // the same callsite
    1.57 +        _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(),
    1.58 +          amount_in_current_scale(cur_malloc_callsite->amount()),
    1.59 +          cur_malloc_callsite->count(),
    1.60 +          diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()),
    1.61 +          diff(cur_malloc_callsite->count(), prev_malloc_callsite->count()));
    1.62 +        cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next();
    1.63 +        prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next();
    1.64 +      }
    1.65      }
    1.66    }
    1.67  

mercurial