javacore-analyser 2.2rc1__py3-none-any.whl → 2.3.0.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright IBM Corp. 2024 - 2024
2
+ # Copyright IBM Corp. 2024 - 2025
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
  #
5
5
 
@@ -24,8 +24,10 @@ UNKNOWN = 'Unknown'
24
24
  STACK_TRACE = '4XESTACKTRACE'
25
25
  NATIVE_STACK_TRACE = '4XENATIVESTACK'
26
26
  DATETIME = '1TIDATETIME'
27
+ STARTTIME = '1CISTARTTIME'
27
28
  SIGINFO = '1TISIGINFO'
28
29
  ENCODING = '1TICHARSET'
30
+ CMD_LINE = '1CICMDLINE'
29
31
 
30
32
  DATA_OUTPUT_SUBDIR = '/data/'
31
33
  DEFAULT_FILE_DELIMITER = ';'
@@ -260,8 +260,13 @@ const loadChart = function () {
260
260
 
261
261
  for(let i=1; i<snapshotsNumber; i++){
262
262
  let rowEl = document.getElementById('all_threads_table_thread_xsl').rows[i];
263
- inputData.push(Number(rowEl.cells[3].innerHTML));
264
- labels.push(String(rowEl.cells[0].innerHTML));
263
+ let value = Number(rowEl.cells[3].innerText);
264
+
265
+ // verify the input data
266
+ if(!isNaN(value)){
267
+ inputData.push(Number(rowEl.cells[3].innerText));
268
+ labels.push(String(rowEl.cells[0].innerText));
269
+ }
265
270
  }
266
271
 
267
272
  new Chart(ctx, {
@@ -159,7 +159,7 @@
159
159
  <button data-search="clear">✖</button>
160
160
  </div>
161
161
  <div class="content">
162
- <h1>Wait Report</h1>
162
+ <h1>Javacore Analyser Report</h1>
163
163
  <div class="margined">
164
164
  from data between
165
165
  <b><xsl:value-of select="doc/report_info/javacores_generation_time/starting_time"/></b> and
@@ -383,6 +383,14 @@
383
383
  <td>Os level</td>
384
384
  <td class="left"><xsl:value-of select="doc/system_info/os_level"/></td>
385
385
  </tr>
386
+ <tr>
387
+ <td>JVM startup time</td>
388
+ <td class="left"><xsl:value-of select="doc/system_info/jvm_start_time"/></td>
389
+ </tr>
390
+ <tr>
391
+ <td>Command line</td>
392
+ <td class="left"><xsl:value-of select="doc/system_info/cmd_line"/></td>
393
+ </tr>
386
394
  </tbody>
387
395
  </table>
388
396
  <h4>Java Arguments</h4>
@@ -533,6 +541,7 @@
533
541
  that may be reused for unrelated tasks. Two tasks with different thread names are therefore treated
534
542
  as separate threads for the purpose of this report, even if they are executed in the scope of the same
535
543
  Thread java object.
544
+ The address of the java Thread object is included for each thread. This corresponds to the address reported in Java heapdumps.
536
545
  The table can be sorted by clicking on any column header.
537
546
  The following information is displayed for each thread:
538
547
  <ul>
@@ -586,7 +595,9 @@
586
595
  <a>
587
596
  <xsl:attribute name="id"><xsl:value-of select="concat('toggle_thread_name',$i)"/></xsl:attribute>
588
597
  <xsl:attribute name="href"><xsl:value-of select="concat('javascript:expand_stack(stack',$i,',toggle_thread_name',$i,')')"/></xsl:attribute>
589
- <xsl:attribute name="class">expandit</xsl:attribute><xsl:value-of select="thread_name"/></a>
598
+ <xsl:attribute name="class">expandit</xsl:attribute>
599
+ <xsl:value-of select="thread_name"/>
600
+ </a>
590
601
  <a class="right" target="_blank">
591
602
  <xsl:attribute name="href">
592
603
  <xsl:value-of select="concat('threads/thread_', thread_hash, '.html')"/>
@@ -596,6 +607,7 @@
596
607
  <br/>
597
608
  <div style="display:none;" >
598
609
  <xsl:attribute name="id"><xsl:value-of select="concat('stack',$i)"/></xsl:attribute>
610
+ java/lang/Thread:<xsl:value-of select="thread_address"/>
599
611
  <xsl:for-each select="*[starts-with(name(), 'stack')]">
600
612
  <div>
601
613
  <xsl:choose>
@@ -33,7 +33,11 @@
33
33
  </div>
34
34
  <div class="content">
35
35
  <p class="right"><a href="../index.html"> Back to Main page </a></p>
36
- <h2>Wait Report for thread: <b><xsl:value-of select="thread_name"/></b></h2>
36
+ <h2>
37
+ Wait Report for thread: <b><xsl:value-of select="thread_name"/></b>
38
+ <br/>
39
+ java/lang/Thread:<xsl:value-of select="thread_address"/>
40
+ </h2>
37
41
  <xsl:choose>
38
42
  <xsl:when test="//javacore_count = 1">
39
43
  System resource utilization data cannot be calculated with only a single javacore.
@@ -8,6 +8,14 @@ from javacore_analyser.abstract_snapshot_collection import AbstractSnapshotColle
8
8
 
9
9
  class Thread(AbstractSnapshotCollection):
10
10
 
11
+ def __init__(self):
12
+ super().__init__()
13
+ self.thread_address = ""
14
+
15
+ def create(self, thread_snapshot):
16
+ super().create(thread_snapshot)
17
+ self.thread_address = thread_snapshot.thread_address
18
+
11
19
  def get_hash(self):
12
20
  id_str = self.name + str(self.id)
13
21
  hashcode = abs(hash(id_str))
@@ -26,6 +34,11 @@ class Thread(AbstractSnapshotCollection):
26
34
  name_node.appendChild(doc.createTextNode(self.name + " (" + str(self.id) + ")"))
27
35
  thread_node.appendChild(name_node)
28
36
 
37
+ # thread address
38
+ thread_address_node = doc.createElement("thread_address")
39
+ thread_address_node.appendChild(doc.createTextNode(self.thread_address))
40
+ thread_node.appendChild(thread_address_node)
41
+
29
42
  # hash
30
43
  hash_node = doc.createElement("thread_hash")
31
44
  hash_node.appendChild(doc.createTextNode(self.get_hash()))
@@ -68,6 +68,8 @@ class JavacoreSet:
68
68
  self.os_level = ""
69
69
  self.architecture = ""
70
70
  self.java_version = ""
71
+ self.jvm_start_time = ""
72
+ self.cmd_line = ""
71
73
  self.user_args = []
72
74
  # end of static information
73
75
  self.files = []
@@ -142,7 +144,7 @@ class JavacoreSet:
142
144
 
143
145
  @staticmethod
144
146
  def __generate_placeholder_htmls(placeholder_file, directory, collection, file_prefix):
145
- logging.info("Generating placeholder htmls")
147
+ logging.info(f"Generating placeholder htmls in {directory}")
146
148
  if os.path.exists(directory):
147
149
  shutil.rmtree(directory)
148
150
  os.mkdir(directory)
@@ -191,6 +193,8 @@ class JavacoreSet:
191
193
  logging.debug("Architecture: {}".format(self.architecture))
192
194
  logging.debug("Java version: {}".format(self.java_version))
193
195
  logging.debug("OS Level: {}".format(self.os_level))
196
+ logging.debug("JVM Startup time: {}".format(self.jvm_start_time))
197
+ logging.debug("Command line: {}".format(self.cmd_line))
194
198
 
195
199
  @staticmethod
196
200
  def create(path):
@@ -267,6 +271,12 @@ class JavacoreSet:
267
271
  elif line.startswith(JAVA_VERSION):
268
272
  self.java_version = line[len(JAVA_VERSION) + 1:].strip()
269
273
  continue
274
+ elif line.startswith(STARTTIME):
275
+ self.jvm_start_time = line[line.find(":") + 1:].strip()
276
+ continue
277
+ elif line.startswith(CMD_LINE):
278
+ self.cmd_line = line[len(CMD_LINE) + 1:].strip()
279
+ continue
270
280
  except Exception as ex:
271
281
  logging.exception(ex)
272
282
  logging.error(f'Error during processing file: {file.name} \n'
@@ -472,6 +482,14 @@ class JavacoreSet:
472
482
  system_info_node.appendChild(os_level_node)
473
483
  os_level_node.appendChild(self.doc.createTextNode(self.os_level))
474
484
 
485
+ jvm_startup_time = self.doc.createElement("jvm_start_time")
486
+ system_info_node.appendChild(jvm_startup_time)
487
+ jvm_startup_time.appendChild(self.doc.createTextNode(self.jvm_start_time))
488
+
489
+ cmd_line = self.doc.createElement("cmd_line")
490
+ system_info_node.appendChild(cmd_line)
491
+ cmd_line.appendChild(self.doc.createTextNode(self.cmd_line))
492
+
475
493
  doc_node.appendChild(self.get_blockers_xml())
476
494
  doc_node.appendChild(self.threads.get_xml(self.doc))
477
495
  doc_node.appendChild(self.stacks.get_xml(self.doc))
@@ -21,6 +21,7 @@ class ThreadSnapshot:
21
21
  self.allocated_mem = 0
22
22
  self.name = None
23
23
  self.thread_id = None
24
+ self.thread_address = None
24
25
  self.thread = None
25
26
  self.javacore = None
26
27
  self.blocker = None
@@ -38,6 +39,7 @@ class ThreadSnapshot:
38
39
  snapshot.file = file
39
40
  snapshot.javacore = javacore
40
41
  snapshot.name = snapshot.get_thread_name(line)
42
+ snapshot.thread_address = snapshot.get_thread_address(line)
41
43
  snapshot.parse_state(line)
42
44
  snapshot.parse_snapshot_data()
43
45
  return snapshot
@@ -76,6 +78,18 @@ class ThreadSnapshot:
76
78
  name = name.translate(str.maketrans({"\01": "[SOH]"}))
77
79
  return name
78
80
 
81
+ def get_thread_address(self, line):
82
+ """ assuming line format:
83
+ 3XMTHREADINFO "Default Executor-thread-27781" J9VMThread:0x0000000009443300,
84
+ omrthread_t:0x000000A8B62C3758, java/lang/Thread:0x00000008432D4140, state:B, prio=5 """
85
+ match = re.search("(java/lang/Thread:)(0x[0-9a-fA-F]+)", line)
86
+ address = ""
87
+ if match: # native threads don't have an address
88
+ address = match.group(2)
89
+ if self.javacore:
90
+ address = self.javacore.encode(address)
91
+ return address
92
+
79
93
  def get_thread_hash(self):
80
94
  if self.thread:
81
95
  return self.thread.get_hash()
@@ -198,18 +212,6 @@ class ThreadSnapshot:
198
212
  file_name = ""
199
213
  if self.file:
200
214
  file_name = self.javacore.filename.split(os.sep)[-1].strip()
201
- # thread name
202
- thread_name_node = doc.createElement("thread_name")
203
- thread_name_node.appendChild(doc.createTextNode(self.name))
204
- thread_snapshot_node.appendChild(thread_name_node)
205
- # thread id
206
- thread_name_node = doc.createElement("thread_id")
207
- thread_name_node.appendChild(doc.createTextNode(str(self.get_thread_id())))
208
- thread_snapshot_node.appendChild(thread_name_node)
209
- # thread hash
210
- thread_hash_node = doc.createElement("thread_hash")
211
- thread_hash_node.appendChild(doc.createTextNode(str(self.get_thread_hash())))
212
- thread_snapshot_node.appendChild(thread_hash_node)
213
215
  # CPU usage
214
216
  cpu_usage_node = doc.createElement("cpu_usage")
215
217
  cpu_usage_node.appendChild(doc.createTextNode(str(self.get_cpu_usage_inc())))
javacore_analyser/tips.py CHANGED
@@ -73,8 +73,8 @@ class DifferentIssuesTip:
73
73
  MAX_INTERVAL_FOR_JAVACORES = 330 # 330 seconds (5 minutes and a little more time)
74
74
  DIFFERENT_ISSUES_MESSAGE = """[WARNING] The time interval between javacore {0} and {1} is {2:.0f} seconds, while
75
75
  the recommended maximum interval between two javacores is 300 seconds (5 minutes). It is likely that these
76
- two javacores do not correspond to one occurrence of a single issue. Please review the list of javacores received
77
- from the customer and run WAIT2 only against the ones that are applicable for the issue you are investigating. """
76
+ two javacores do not correspond to one occurrence of a single issue. Please review the list of javacores
77
+ and the tool only against the ones that are applicable for the issue you are investigating. """
78
78
 
79
79
  @staticmethod
80
80
  def generate(javacore_set):
@@ -103,7 +103,7 @@ class TooFewJavacoresTip:
103
103
 
104
104
  MIN_NUMBER_OF_JAVACORES = 10
105
105
 
106
- ONE_JAVACORE_WARNING = '''[WARNING] You generated this WAIT2 report with only one javacore.
106
+ ONE_JAVACORE_WARNING = '''[WARNING] You generated this the report with only one javacore.
107
107
  CPU usage calculation is not possible.'''
108
108
 
109
109
  NOT_ENOUGH_JAVACORES_MESSAGE = """[WARNING] You ran the tool against {0} Javacores. The analysis
@@ -1,11 +1,12 @@
1
1
  #
2
- # Copyright IBM Corp. 2024 - 2024
2
+ # Copyright IBM Corp. 2024 - 2025
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
  #
5
5
 
6
6
  import logging
7
7
  import ntpath
8
8
  from datetime import datetime
9
+ from pathlib import Path
9
10
  from xml.dom.minidom import Element, parseString
10
11
 
11
12
  from tqdm import tqdm
@@ -59,7 +60,7 @@ class VerboseGcParser:
59
60
  file.set_number_of_collects(collects_from_time_range)
60
61
  except GcVerboseProcessingException as ex:
61
62
  logging.warning(file_path + " was omitted due to error", ex)
62
- logging.info("Finished parsing GC files.")
63
+ logging.info("Finished parsing GC files")
63
64
 
64
65
  def get_xml(self, doc):
65
66
  element = doc.createElement(GC_COLLECTIONS)
@@ -110,22 +111,11 @@ class VerboseGcFile:
110
111
  self.__parse()
111
112
 
112
113
  def __parse(self):
113
- # read in the file as collection of lines
114
- file = None
115
114
  try:
116
- xml_text = ""
117
- root_closing_tag_available = False
118
- file = open(self.__path, 'r+')
119
- lines = file.readlines()
120
- # find the last non-empty line
121
- for line in lines:
122
- line = line.strip()
123
- # workaround for https://github.com/eclipse-openj9/openj9/issues/17978
124
- line = line.replace("&#x1;", "?")
125
- xml_text = xml_text + line
126
- if line == ROOT_CLOSING_TAG: root_closing_tag_available = True
127
-
128
- if not root_closing_tag_available:
115
+ file = Path(self.__path)
116
+ xml_text = file.read_text()
117
+ xml_text = xml_text.replace("&#x1;", "?")
118
+ if ROOT_CLOSING_TAG not in xml_text:
129
119
  xml_text = xml_text + ROOT_CLOSING_TAG
130
120
  logging.debug("adding closing tag")
131
121
 
@@ -133,8 +123,6 @@ class VerboseGcFile:
133
123
  self.__root = self.__doc.documentElement
134
124
  except Exception as ex:
135
125
  raise GcVerboseProcessingException() from ex
136
- finally:
137
- if not file.closed: file.close()
138
126
 
139
127
  def get_file_name(self):
140
128
  head, tail = ntpath.split(self.__path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: javacore_analyser
3
- Version: 2.2rc1
3
+ Version: 2.3.0.dev2
4
4
  Summary: The tool to review IBM Javacore files
5
5
  Project-URL: Homepage, https://github.com/IBM/javacore-analyser
6
6
  Project-URL: Issues, https://github.com/IBM/javacore-analyser/issues
@@ -278,7 +278,8 @@ Steps:
278
278
  3. Run the following command:
279
279
  `pip install javacore-analyser`
280
280
  OR
281
- `pip install --pre --extra-index-url https://test.pypi.org/simple/ javacore-analyser` - if you want an experimental version
281
+ `pip install --pre javacore-analyser` - if you want an experimental version
282
+
282
283
 
283
284
  #### Installing from sources
284
285
  This is recommended for geeks only:
@@ -311,19 +312,20 @@ You can type the following command to obtain the help:
311
312
  or
312
313
  `python -m javacore_analyser web --port=5000 --reports-dir=/data/reports_dir`
313
314
 
315
+
314
316
  The first parameter set the port to use by application. If not specified, 5000 will be used.
315
317
  The second parameter sets where the reports need to be stored. If not set, then the `reports` dir will be created in current location.
316
318
 
317
319
  Now you can type (http://localhost:5000/).
318
320
 
319
321
  ### Running container image
320
- There is an unofficial Docker/Podman container managed by one of projects developers. Use the following command
322
+ There is a Docker/Podman container managed by one of projects developers. Use the following command
321
323
  to start it:
322
324
 
323
- `podman run -it --rm --name javacore-analyser --mount type=bind,src="/local-reports-dir",target=/reports -p 5001:5000 ghcr.io/kkazmierczyk/javacore-analyser:latest`
325
+ `podman run -it --rm --name javacore-analyser --mount type=bind,src="/local-reports-dir",target=/reports -p 5001:5000 ghcr.io/ibm/javacore-analyser:latest`
324
326
 
325
327
  or
326
- `docker run -it --rm --name javacore-analyser --mount type=bind,src="/local-reports-dir",target=/reports -p 5001:5000 ghcr.io/kkazmierczyk/javacore-analyser:latest`
328
+ `docker run -it --rm --name javacore-analyser --mount type=bind,src="/local-reports-dir",target=/reports -p 5001:5000 ghcr.io/ibm/javacore-analyser:latest`
327
329
 
328
330
  The `mount` option specifies where you want locally to store the reports. The reports in the container are stored in
329
331
  `/reports` directory. If you remove mount option, the application will work but the reports will not persist after
@@ -2,22 +2,22 @@ javacore_analyser/__init__.py,sha256=Sw2ZeqcI2Kx1cDDv083n1SiSY_FDRCmidTuzaN1uRSw
2
2
  javacore_analyser/__main__.py,sha256=wQCPgu8Gp7XczyNckNGmY30c5YMUMRByW7jrdFO0OBY,1694
3
3
  javacore_analyser/abstract_snapshot_collection.py,sha256=jGfd2XgujurRlKgEtlJjqNJK9sUvTdFsdgFnX9oLzt4,5589
4
4
  javacore_analyser/code_snapshot_collection.py,sha256=6_C5myag5ocjOTwXVDbBamN6Lf1szgS3ylSHEEjUdVg,2655
5
- javacore_analyser/constants.py,sha256=iGYAznPK8AySq6uqk-cpCU8Dbjbq6PrCh6q2mF8oeu8,1003
5
+ javacore_analyser/constants.py,sha256=7-gbGLzUMIMe2UvmLT17ymmy_r_izadpAyhrEKFonP8,1054
6
6
  javacore_analyser/har_file.py,sha256=grXpfIyPek9xQ5jp3_AYOB5JDELd17o4O4rYELxWO7w,2131
7
- javacore_analyser/java_thread.py,sha256=4zUfmmlH47SrIxgfPmrJHl_YUziVJXVNVedD5X25vXY,4464
7
+ javacore_analyser/java_thread.py,sha256=0Qh857o0M05sO_WRkNM5DFtBK03HytUwdMp7Ha1WXGI,4916
8
8
  javacore_analyser/javacore.py,sha256=_2abTyvXEaZ6Tx8r9d3NEzRCIBcf4Is8lSjpKyPu-R8,6884
9
9
  javacore_analyser/javacore_analyser_batch.py,sha256=D9H6ct_PBAXR_PvTqGtKw_FIx9Q9KuJSFBeEZ2FIkbo,7607
10
10
  javacore_analyser/javacore_analyser_web.py,sha256=o-Spq119Wi7w4pvBa7M7ZrxiZnzKmWqDhCdGtEReQAU,5951
11
- javacore_analyser/javacore_set.py,sha256=R3QiyDfDOBtzTUwQzS8ft2-Ca7fkReSD5KJzgZl6oVY,32103
11
+ javacore_analyser/javacore_set.py,sha256=g-1NtOJ6r6HB6JqzIWVPjFJrXGNweBJx7WoavkF0ggE,32995
12
12
  javacore_analyser/logging_utils.py,sha256=vLob0ikezysjGv9XGqv9GbLekxu4eO_csq22M-gtLiQ,966
13
13
  javacore_analyser/snapshot_collection.py,sha256=fLEnwg9-cOjVVUUludtzI7R2yO9BBVgJgxkhvqG5QDg,443
14
14
  javacore_analyser/snapshot_collection_collection.py,sha256=1PV1TX4QQk01dAbX-k-kTpgKr6Il867Bw6X7HHBuv-Q,1346
15
15
  javacore_analyser/stack_trace.py,sha256=8sb8z4ac_L0yyxqJX1ukrTZRyngkHcA3zkXyqxG5ygA,1664
16
16
  javacore_analyser/stack_trace_element.py,sha256=pZPrK1ACBUDE7YsVOFhTfewXequ1m5P-B0N-9RuhkWo,1143
17
17
  javacore_analyser/stack_trace_kind.py,sha256=lOdfb_F3XrwDLciPk_ZgM_fmMn5JoXsIUjr7pjvmU4M,157
18
- javacore_analyser/thread_snapshot.py,sha256=2Do8NPBXdpUezQrUI_9nyGbtU4b2s5euPnHqcuuKq7U,13255
19
- javacore_analyser/tips.py,sha256=EhwLUAha0FvFJtO5kmvba9a1nKXGdqNHFa2jFbHZr4U,8655
20
- javacore_analyser/verbose_gc.py,sha256=r5ZOZVhdrrgFTGo1Rx-FFPFNRpvX1jflP6AkNATMpIQ,6871
18
+ javacore_analyser/thread_snapshot.py,sha256=yp7uJwF5adMN2UAhOn-lLtSP2X3j8utUfafjyKu8r4E,13252
19
+ javacore_analyser/tips.py,sha256=JggNTmCkH2x2jqFChdnWlex8hU9q3Gy5IqJaxDQtPwI,8625
20
+ javacore_analyser/verbose_gc.py,sha256=FdSzj9bB9GrJVM8qzkvjNm0LsJZRvKWpd2oMQ8G8eEE,6373
21
21
  javacore_analyser/data/expand.js,sha256=KwqvNUoO7yMDeQKcnLDywfMdR3Zsjan5L8QoPsQQLGo,956
22
22
  javacore_analyser/data/style.css,sha256=HSKPajW3EItHjye6mSGNMRPEzfE2r7o1Gq-BEAI54Ts,2879
23
23
  javacore_analyser/data/html/error.html,sha256=dJI5RdeNL1E4Y-zaU7NTBqrsxCuAovVc1Cebrk5GcYA,520
@@ -33,16 +33,16 @@ javacore_analyser/data/jquery/search.js,sha256=Jwi-cBJ9YKDHJwqIlcKXqrpcM1BX-wx93
33
33
  javacore_analyser/data/jquery/sorting.js,sha256=HsuVLa7F70IM4ZMXZpjj7wtVI1TXL1SPbZGWenv0Jp8,369
34
34
  javacore_analyser/data/jquery/theme.blue.css,sha256=cPcj8KaUj_zNy_xtDfrodSLue94nnYgyVNIZRusggCw,7624
35
35
  javacore_analyser/data/jquery/theme.default.min.css,sha256=5sgExNTnkN8NcApKIU73_aqgZmqq_zJp9-9zXf9aSEw,4502
36
- javacore_analyser/data/jquery/wait2scripts.js,sha256=z6zmSAak0R6bjh7BeHlIOSImiZSy5Y3z5ygMiN-sPxI,8460
36
+ javacore_analyser/data/jquery/wait2scripts.js,sha256=jORUs9xgz_o-VnRm0RxjKlraZOleQrPp5DmTyrMBwrM,8577
37
37
  javacore_analyser/data/xml/index.xml,sha256=9VH2rmri3FQpXcW39kbyi2dON94C5XTiaQn0ioExCe8,282
38
- javacore_analyser/data/xml/report.xsl,sha256=_0b2i97QvCnauC-ZiNWndTQZzWGM18DH_hU7k4kUIno,58761
38
+ javacore_analyser/data/xml/report.xsl,sha256=uum_nBGzSyCa8LL51xjWQXUxYxo-1VR9wkhJrS_dbnI,59605
39
39
  javacore_analyser/data/xml/javacores/javacore.xml,sha256=6dG89Whx1_kpEYVS_F6Upa2XuXnXorlQATFc8kD5Mfc,280
40
40
  javacore_analyser/data/xml/javacores/javacore.xsl,sha256=5cnIp08Q9FccljHH8duoJQYofyW8lwUCGtpdzz5Y0Y8,11644
41
41
  javacore_analyser/data/xml/threads/thread.xml,sha256=6dG89Whx1_kpEYVS_F6Upa2XuXnXorlQATFc8kD5Mfc,280
42
- javacore_analyser/data/xml/threads/thread.xsl,sha256=rkqr5GQ2aZ_xrdhUjl2QZDCZ-09zxqUmtV8DFZVjTAA,13927
42
+ javacore_analyser/data/xml/threads/thread.xsl,sha256=1tg5tImtr1gyZ8Q61tqIukNtm1fQ6R8YoKC3EgIjLRA,14084
43
43
  javacore_analyser/templates/index.html,sha256=aEuyry-HZ9HlQNwfbugugvqbSxwlo7LrQnrDmqO34YE,1682
44
- javacore_analyser-2.2rc1.dist-info/METADATA,sha256=k0X6Ym946yfW7F5FPJsEdKit9HJENda2Vw4F1syALSA,22285
45
- javacore_analyser-2.2rc1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
- javacore_analyser-2.2rc1.dist-info/entry_points.txt,sha256=W3S799zI58g5-jWMsC3wY9xksz21LPEMYOILv8sayfM,160
47
- javacore_analyser-2.2rc1.dist-info/licenses/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
48
- javacore_analyser-2.2rc1.dist-info/RECORD,,
44
+ javacore_analyser-2.3.0.dev2.dist-info/METADATA,sha256=VGQNd-cQT9Lg9Fhu5tc8AQNgjdVyB9khx72f_oQEQ0E,22213
45
+ javacore_analyser-2.3.0.dev2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
+ javacore_analyser-2.3.0.dev2.dist-info/entry_points.txt,sha256=W3S799zI58g5-jWMsC3wY9xksz21LPEMYOILv8sayfM,160
47
+ javacore_analyser-2.3.0.dev2.dist-info/licenses/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
48
+ javacore_analyser-2.3.0.dev2.dist-info/RECORD,,