Output formats
Choose an output shape with --format. The default is text.
| Format | Shape | Streams from stdin? |
|---|---|---|
text |
One human-readable line per frame | Yes |
json |
One JSON document for the whole run | No (collected) |
json-pretty |
The same document, indented | No (collected) |
json-lines |
One JSON object per address (ndjson) | Yes |
Text
atosl -o app.dSYM -l 0x100000000 0x100001234
my::function (in app) (src/main.rs:42) # DWARF source available
my::function (in app) + 16 # symbol-table fallback (offset)
N/A - failed to search symbol table # could not resolve
See Inline frames for how --inline-frames changes text output.
JSON document
json (compact) and json-pretty (indented) emit a single document:
atosl -o app.dSYM -l 0x100000000 --format json-pretty 0x100001234
{
"object_path": "app.dSYM",
"object_name": "app",
"selected_slice": {
"arch": "arm64",
"uuid": "34FBD46D-4A1F-3B41-A0F1-4E57D7E25B04"
},
"frames": [
{
"status": "resolved",
"requested_address": 4294971956,
"lookup_address": 4660,
"symbol": "main",
"object_name": "app",
"offset": 0,
"resolver": "symbol_table",
"location": { "file": "src/main.rs", "line": 12 }
}
]
}
JSON lines (ndjson)
json-lines prints one JSON object per address, one per line. It streams in
input mode, so it pairs well with a pipe:
printf '0x100001234\n0xdeadbeef\n' | atosl -o app.dSYM -l 0x100000000 --format json-lines
{"status":"resolved","requested_address":4294971956,"lookup_address":4660,"symbol":"main","object_name":"app","offset":0,"resolver":"dwarf","location":{"file":"src/main.rs","line":12}}
{"status":"unresolved","requested_address":3735928559,"error":"address is smaller than load address ..."}
Each line is independently valid JSON, so you can process it with jq as it
arrives:
cat addrs.txt | atosl -o app.dSYM -l 0x100000000 --format json-lines \
| jq -r 'select(.status=="resolved") | "\(.symbol) \(.location.file):\(.location.line)"'
Field reference
Report (json / json-pretty)
| Field | Meaning |
|---|---|
object_path |
The -o path as given |
object_name |
The image’s file name |
selected_slice |
{arch, uuid} of the chosen fat slice, or null |
frames |
One outcome per requested address |
Frame outcome (also each json-lines row)
A resolved frame:
| Field | Meaning |
|---|---|
status |
"resolved" |
requested_address |
The address you passed (decimal) |
lookup_address |
The static VM address actually looked up |
symbol |
Function name (demangled) |
object_name |
Image the symbol belongs to |
offset |
Byte offset from the symbol start (symbol-table results) |
resolver |
"dwarf" or "symbol_table" |
location |
{file, line} when DWARF has it, else omitted |
inlined_by |
Enclosing inline frames, outermost last (only when present) |
An unresolved frame:
| Field | Meaning |
|---|---|
status |
"unresolved" |
requested_address |
The address you passed |
error |
Why it could not be resolved |
The
framesarray is always 1:1 with the input addresses, even when inline frames are present — the inline stack lives insideinlined_by, not as extra array entries.