@@ -92,9 +92,17 @@ follows:
92
92
| | | only has effect on platforms that have a symbol |
93
93
| | | cache that can be controlled by the runtime. |
94
94
+-----------------+---------+--------------------------------------------------+
95
+ | format | text | Set to ``json `` to output JSON crash logs rather |
96
+ | | | than plain text. |
97
+ +-----------------+---------+--------------------------------------------------+
95
98
| output-to | stdout | Set to ``stderr `` to send the backtrace to the |
96
99
| | | standard error instead of standard output. This |
97
100
| | | may be useful in some CI systems. |
101
+ | | | |
102
+ | | | You may also specify a path; if this points at a |
103
+ | | | directory, the backtracer will generate unique |
104
+ | | | filenames within that directory. Otherwise it |
105
+ | | | is assumed to be a filename. |
98
106
+-----------------+---------+--------------------------------------------------+
99
107
| symbolicate | full | Options are ``full ``, ``fast ``, or ``off ``. |
100
108
| | | Full means to look up source locations and |
@@ -334,3 +342,200 @@ large number of frames in a much smaller space than would otherwise be possible.
334
342
Similarly, where we need to store address to image mappings, we
335
343
use :download: `Compact ImageMap Format <CompactImageMapFormat.md >` to minimise
336
344
storage requirements.
345
+
346
+ JSON Crash Logs
347
+ ---------------
348
+
349
+ JSON crash logs are a structured crash log format that the backtracer is able
350
+ to output. Note that addresses are represented in this format as hexadecimal
351
+ strings, rather than as numbers, in order to avoid representational issues.
352
+ Additionally, boolean fields that are ``false ``, as well as fields whose
353
+ values are unknown or empty, will normally be completely omitted to save space.
354
+
355
+ Where hexadecimal *values * are output, they will normally be prefixed with
356
+ a ``0x `` prefix. Hexadecimal *data *, by contrast, such as captured memory or
357
+ build IDs, will not have a prefix and will be formatted as a string with no
358
+ whitespace.
359
+
360
+ Note that since JSON does not officially support hexadecimal, hexadecimal
361
+ values will always be output as strings.
362
+
363
+ JSON crash logs will always contain the following top level fields:
364
+
365
+ +-------------------+--------------------------------------------------------+
366
+ | Field | Value |
367
+ +===================+========================================================+
368
+ | timestamp | An ISO-8601 formatted timestamp, as a string. |
369
+ +-------------------+--------------------------------------------------------+
370
+ | kind | The string ``crashReport ``. |
371
+ +-------------------+--------------------------------------------------------+
372
+ | description | A textual description of the crash or runtime failure. |
373
+ +-------------------+--------------------------------------------------------+
374
+ | faultAddress | The fault address associated with the crash. |
375
+ +-------------------+--------------------------------------------------------+
376
+ | platform | A string describing the platform; the first token |
377
+ | | identifies the platform itself and is followed by |
378
+ | | platform specific version information. |
379
+ | | |
380
+ | | e.g. "macOS 13.0 (22A380)", |
381
+ | | "linux (Ubuntu 22.04.5 LTS)" |
382
+ +-------------------+--------------------------------------------------------+
383
+ | architecture | The name of the processor architecture for this crash. |
384
+ +-------------------+--------------------------------------------------------+
385
+ | threads | An array of thread records, one for each thread. |
386
+ +-------------------+--------------------------------------------------------+
387
+
388
+ These will be followed by some or all of the following, according to the
389
+ backtracer settings:
390
+
391
+ +-------------------+--------------------------------------------------------+
392
+ | Field | Value |
393
+ +===================+========================================================+
394
+ | omittedThreads | A count of the number of threads that were omitted, if |
395
+ | | the backtracer is set to give a backtrace only for the |
396
+ | | crashed thread. Omitted if zero. |
397
+ +-------------------+--------------------------------------------------------+
398
+ | capturedMemory | A dictionary containing captured memory contents, if |
399
+ | | any. This will not be present if the ``sanitize `` |
400
+ | | setting is enabled, or if no data was captured. |
401
+ | | |
402
+ | | The dictionary is keyed by hexadecimal addresses, as |
403
+ | | strings (with a ``0x `` prefix); the captured data is |
404
+ | | also given as a hexadecimal string, but with no prefix |
405
+ | | and no inter-byte whitespace. |
406
+ | | |
407
+ | | You should make no assumptions about the number of |
408
+ | | bytes captured at each address; the backtracer will |
409
+ | | currently attempt to grab 16 bytes, but this may |
410
+ | | change if only a shorter range is available or in |
411
+ | | future according to configuration parameters. |
412
+ +-------------------+--------------------------------------------------------+
413
+ | omittedImages | If ``images `` is set to ``mentioned ``, this is an |
414
+ | | integer giving the number of images whose details were |
415
+ | | omitted from the crash log. |
416
+ +-------------------+--------------------------------------------------------+
417
+ | images | Unless ``images `` is ``none ``, an array of records |
418
+ | | describing the loaded images in the crashed process. |
419
+ +-------------------+--------------------------------------------------------+
420
+ | backtraceTime | The time taken to generate the crash report, in |
421
+ | | seconds. |
422
+ +-------------------+--------------------------------------------------------+
423
+
424
+ Thread Records
425
+ ^^^^^^^^^^^^^^
426
+
427
+ A thread record is a dictionary with the following fields:
428
+
429
+ +-------------------+--------------------------------------------------------+
430
+ | Field | Value |
431
+ +===================+========================================================+
432
+ | name | The name of the thread. Omitted if no name. |
433
+ +-------------------+--------------------------------------------------------+
434
+ | crashed | ``true `` if the thread is the one that crashed, |
435
+ | | omitted otherwise. |
436
+ +-------------------+--------------------------------------------------------+
437
+ | registers | A dictionary containing the register contents on the |
438
+ | | crashed thread. |
439
+ | | |
440
+ | | The dictionary is keyed by architecture specific |
441
+ | | register name; values are given as hexadecimal |
442
+ | | strings (with a ``0x `` prefix). |
443
+ | | |
444
+ | | This field may be omitted for threads other than the |
445
+ | | crashed thread, if the ``registers `` setting is set |
446
+ | | to ``crashed ``. |
447
+ +-------------------+--------------------------------------------------------+
448
+ | frames | An array of frames forming the backtrace for the |
449
+ | | thread. |
450
+ +-------------------+--------------------------------------------------------+
451
+
452
+ Each frame in the backtrace is described by a dictionary containing the
453
+ following fields:
454
+
455
+ +-------------------+--------------------------------------------------------+
456
+ | Field | Value |
457
+ +===================+========================================================+
458
+ | kind | ``programCounter `` if the frame address is a directly |
459
+ | | captured program counter/instruction pointer. |
460
+ | | |
461
+ | | ``returnAddress `` if the frame address is a return |
462
+ | | address. |
463
+ | | |
464
+ | | ``asyncResumePoint `` if the frame address is a |
465
+ | | resumption point in an ``async `` function. |
466
+ | | |
467
+ | | ``omittedFrames `` if this is a frame omission record. |
468
+ | | |
469
+ | | ``truncated `` to indicate that the backtrace is |
470
+ | | truncated at this point and that more frames were |
471
+ | | available but not captured. |
472
+ +-------------------+--------------------------------------------------------+
473
+ | address | The frame address as a string (for records containing |
474
+ | | an address). |
475
+ +-------------------+--------------------------------------------------------+
476
+ | count | The number of frames omitted at this point in the |
477
+ | | backtrace (``omittedFrames `` only). |
478
+ +-------------------+--------------------------------------------------------+
479
+
480
+ If the backtrace is symbolicated, the frame record may also contain the
481
+ following additional information:
482
+
483
+ +-------------------+--------------------------------------------------------+
484
+ | Field | Value |
485
+ +===================+========================================================+
486
+ | inlined | ``true `` if this frame is inlined, omitted otherwise. |
487
+ +-------------------+--------------------------------------------------------+
488
+ | runtimeFailure | ``true `` if this frame represents a Swift runtime |
489
+ | | failure, omitted otherwise. |
490
+ +-------------------+--------------------------------------------------------+
491
+ | thunk | ``true `` if this frame is a compiler-generated thunk |
492
+ | | function, omitted otherwise. |
493
+ +-------------------+--------------------------------------------------------+
494
+ | system | ``true `` if this frame is a system frame, omitted |
495
+ | | otherwise. |
496
+ +-------------------+--------------------------------------------------------+
497
+
498
+ If symbol lookup succeeded for the frame address, the following additional
499
+ fields will be present:
500
+
501
+ +-------------------+--------------------------------------------------------+
502
+ | Field | Value |
503
+ +===================+========================================================+
504
+ | symbol | The mangled name of the symbol corresponding to the |
505
+ | | frame address. |
506
+ +-------------------+--------------------------------------------------------+
507
+ | offset | The offset from the symbol to the frame address. |
508
+ +-------------------+--------------------------------------------------------+
509
+ | description | If demangling is enabled, a human readable description |
510
+ | | of the frame address, otherwise omitted. |
511
+ +-------------------+--------------------------------------------------------+
512
+ | image | The name of the image in which the symbol was found; |
513
+ | | omitted if no corresponding image exists. |
514
+ +-------------------+--------------------------------------------------------+
515
+ | sourceLocation | If the source location of the symbol is known, a |
516
+ | | dictionary containing ``file ``, ``line `` and |
517
+ | | ``column `` keys that identify the location of the |
518
+ | | symbol in the source files. |
519
+ +-------------------+--------------------------------------------------------+
520
+
521
+ Image Records
522
+ ^^^^^^^^^^^^^
523
+
524
+ An image record is a dictionary with the following fields:
525
+
526
+ +-------------------+--------------------------------------------------------+
527
+ | Field | Value |
528
+ +===================+========================================================+
529
+ | name | The name of the image (omitted if not known). |
530
+ +-------------------+--------------------------------------------------------+
531
+ | buildId | The build ID (aka unique ID) of the image (omitted if |
532
+ | | not known). Build IDs are formatted as un-prefixed |
533
+ | | hexadecimal strings, with no inter-byte whitespace. |
534
+ +-------------------+--------------------------------------------------------+
535
+ | path | The path to the image (omitted if not known). |
536
+ +-------------------+--------------------------------------------------------+
537
+ | baseAddress | The base address of the image text, as a hexadecimal |
538
+ | | string. |
539
+ +-------------------+--------------------------------------------------------+
540
+ | endOfText | The end of the image text, as a hexadecimal string. |
541
+ +-------------------+--------------------------------------------------------+
0 commit comments