Skip to content

Troubleshooting

Log Files

The default location of standard node log files for various systems:

OS Location
Windows C:\Users\<user>\AppData\Local\Nano\log -or- %LOCALAPPDATA%\Nano\log
macOS /Users/<user>/Library/Nano/log
Linux /home/<user>/Nano/log

To get a static file name for the currently active log file, see the stable_log_filename configuration option


What to do if the node crashes (Linux)

Do not restart the node

If your node crashes, please follow this guide before attempting to run it again.

If the node crashes, the most commonly seen message is "Segmentation fault (core dumped)". When using docker, this message will only show up in the docker logs. In any case, this is often not enough to go on in terms of figuring out what went wrong. The next steps detail what you should do to provide us with as much information as possible about the problem.

When you are done gathering all information, please create a new Github issue, or reach us on Discord in the #support channel, detailing your issue as much as possible.

Getting the latest node log

The following command will order the log files such that the first one in the output is the most recent. If you restarted the node since the crash, then the relevant log file is not the latest one. Please be careful to give us the relevant log file.

# Nano -> NanoBeta if debugging a beta node
ls -dlt ~/Nano/log/* | head

Please provide the complete log file.

Please follow the steps below for the corresponding node version you are using. Should there be an error obtaining the information in a newer version, the older version steps should then be attempted.

v21+ nodes

Step 1: Make sure addr2line is installed

It is likely installed already, consult documentation for your linux distribution if it is not mentioned below:
Ubuntu/Debian apt-get install binutils

Fedora 22+
dnf install binutils

(Optional) Step 2: Save crash dump files

The next step will clean up the dump files generated during the crash, if you wish to keep these then save nano_node_backtrace.dump, and all nano_node_crash_load_address_dump_*.txt files.

Step 3: Generate crash report

Run: ./nano_node --debug_generate_crash_report

This will generate a text file nano_node_crash_report.txt please send us the contents of this file.

v20 nodes

Step 1: Getting dmesg information

Depending on the error, it is possible you do not find any useful information in this step, in which case please move on to Step 3. Run the following command and look for nano_node at the end. If you see a relevant message, gather all messages with a similar timestamp - the number within brackets on the left.

dmesg

Example output:

[    6.336071] IPv6: ADDRCONF(NETDEV_CHANGE): wlp2s0: link becomes ready
[    6.375123] wlp2s0: Limiting TX power to 23 (23 - 0) dBm as advertised by **:**:**:**:**:**
[ 6141.711993] show_signal_msg: 23 callbacks suppressed
[ 6141.711995] I/O[14487]: segfault at 1 ip 000055c69d3a1634 sp 00007f6e9332df10 error 6 in nano_node[55c69d25f000+70b000]
[ 6141.711999] Code: 24 70 48 83 c5 10 48 89 c3 48 39 ef 74 b6 e8 e3 b8 39 00 eb af 90 41 57 41 56 41 55 41 54 49 89 fc 55 53 48 81 ec a8 00 00 00 <c6> 04 25 01 00 00 00 31 64 48 8b 04 25 28 00 00 00 48 89 84 24 98

From this output, only the last 3 lines are relevant.

Step 2: Getting syslog information

More information might be available in syslog. Run the following command and look for the time the crash ocurred.

cat /var/log/syslog

Example output:

Aug 15 11:56:07 ubuntu-server kernel: [6141.711993] show_signal_msg: 23 callbacks suppressed
Aug 15 11:56:07 ubuntu-server kernel: [6141.711995] I/O[25975]: segfault at 1 ip 000055b2960e2d24 sp 00007fcff50f6fc0 error 6 in nano_node[55b295f9b000+6d8000]
Aug 15 11:56:07 ubuntu-server kernel: [6141.711999] Code: 24 70 48 83 c5 10 48 89 c3 48 39 ef 74 b6 e8 e3 b8 39 00 eb af 90 41 57 41 56 41 55 41 54 49 89 fc 55 53 48 81 ec a8 00 00 00 <c6> 04 25 01 00 00 00 31 64 48 8b 04 25 28 00 00 00 48 89 84 24 98

Include the relevant lines from the output. In this example, the log is similar to the one from Step 2.

Step 3: Getting a backtrace dump

This command will produce some basic information about the error.

Not using docker:

./nano_node --debug_output_last_backtrace_dump > nano_node_backtrace_output.txt

Using docker:

mkdir -p /tmp/nano_node_crash && cd $_
docker exec ${NANO_NAME} nano_node --debug_output_last_backtrace_dump > nano_node_backtrace_output.txt
docker exec ${NANO_NAME} sh -c 'mkdir -p crash_files; mv nano_node_crash*.txt crash_files/'
docker cp ${NANO_NAME}:/crash_files/ . && mv crash_files/* .

Step 4: Producing the archive file

See the output of this command for the name of the file you should include in your report.

FILE="nano_node_crash_$(date +"%Y-%m-%d_%H-%M-%S.tar.gz")" && tar czf $FILE --exclude=*.tar.gz nano_node_* && echo "Created archive $FILE"


Statistics from RPC

The "stats" RPC command can be used by external processes to query statistics, such as traffic counters. This is useful for diagnostics, monitoring and display in admin consoles.

Statistics are optionally logged to separate text files.

For implementations details, please see Statistics API

Duplicate observer stats

Under certain conditions, confirmations seen through the observer type stat can be duplicates. In order to get accurate data, block hashes must be tracked and validated against previously seen hashes.

Configuration

All configuration nodes and values are optional, with the default values shown in comments below:

"node": {
    ...
    "statistics": {

        // Sampling configuration (optional)
        // Only activate if you need sampling information, as there's some overhead associated with this feature.
        "sampling": {
            "enabled": "true",                // If sampling is enabled. Default false.
            "capacity": "5",                  // How many samples to keep. Must be set if sampling is enabled.
            "interval": "1000"                // Sample interval in milliseconds. Must be set if sampling is enabled.
        },

        // File logging (optional)
        "log": {                              
            "interval_counters": "5000",      // How often to write counters to file in milliseconds. Default 0 (off)
            "interval_samples": "5000",       // How often to write samples to file, milliseconds. Default 0 (off)
            "rotation_count": "5",            // Rotate file after writing statistics this many times. Default 100.
            "headers": "true",                // Write header containing log
            "filename_counters": "counters.stat",
            "filename_samples": "samples.stat"
        }
    }
}

Available type, detail and direction values

version 25.0+

type:
    traffic_tcp
    error
    message
    block
    ledger
    rollback
    bootstrap
    tcp_server
    vote
    election
    http_callback
    ipc
    tcp
    confirmation_height
    confirmation_observer
    drop
    aggregator
    requests
    filter
    telemetry
    vote_generator
    vote_cache
    hinting
    blockprocessor
    bootstrap_server
    active
    active_started
    active_confirmed
    active_dropped
    active_timeout
    backlog
    unchecked
    election_scheduler
    optimistic_scheduler
    handshake
    bootstrap_ascending
    bootstrap_ascending_accounts

details:
    all

    // common
    ok
    loop
    total
    process
    update
    request
    broadcast

    // processing queue
    queue
    overfill
    batch

    // error specific
    insufficient_work
    http_callback
    unreachable_host
    invalid_network

    // confirmation_observer specific
    active_quorum
    active_conf_height
    inactive_conf_height

    // ledger, block, bootstrap
    send
    receive
    open
    change
    state_block
    epoch_block
    fork
    old
    gap_previous
    gap_source
    rollback_failed
    progress
    bad_signature
    negative_spend
    unreceivable
    gap_epoch_open_pending
    opened_burn_account
    balance_mismatch
    representative_mismatch
    block_position

    // message specific
    not_a_type
    invalid
    keepalive
    publish
    confirm_req
    confirm_ack
    node_id_handshake
    telemetry_req
    telemetry_ack
    asc_pull_req
    asc_pull_ack

    // bootstrap, callback
    initiate
    initiate_legacy_age
    initiate_lazy
    initiate_wallet_lazy

    // bootstrap specific
    bulk_pull
    bulk_pull_account
    bulk_pull_error_starting_request
    bulk_pull_failed_account
    bulk_pull_request_failure
    bulk_push
    frontier_req
    error_socket_close

    // vote specific
    vote_valid
    vote_replay
    vote_indeterminate
    vote_invalid
    vote_overflow

    // election specific
    vote_new
    vote_processed
    vote_cached
    election_block_conflict
    generate_vote
    generate_vote_normal
    generate_vote_final

    // election types
    normal
    hinted
    optimistic

    // received messages
    invalid_header
    invalid_message_type
    invalid_keepalive_message
    invalid_publish_message
    invalid_confirm_req_message
    invalid_confirm_ack_message
    invalid_node_id_handshake_message
    invalid_telemetry_req_message
    invalid_telemetry_ack_message
    invalid_bulk_pull_message
    invalid_bulk_pull_account_message
    invalid_frontier_req_message
    invalid_asc_pull_req_message
    invalid_asc_pull_ack_message
    message_too_big
    outdated_version

    // tcp
    tcp_accept_success
    tcp_accept_failure
    tcp_write_drop
    tcp_write_no_socket_drop
    tcp_excluded
    tcp_max_per_ip
    tcp_max_per_subnetwork
    tcp_silent_connection_drop
    tcp_io_timeout_drop
    tcp_connect_error
    tcp_read_error
    tcp_write_error

    // ipc
    invocations

    // peering
    handshake

    // confirmation height
    blocks_confirmed
    blocks_confirmed_unbounded
    blocks_confirmed_bounded

    // [request] aggregator
    aggregator_accepted
    aggregator_dropped

    // requests
    requests_cached_hashes
    requests_generated_hashes
    requests_cached_votes
    requests_generated_votes
    requests_cannot_vote
    requests_unknown

    // duplicate
    duplicate_publish

    // telemetry
    invalid_signature
    node_id_mismatch
    genesis_mismatch
    request_within_protection_cache_zone
    no_response_received
    unsolicited_telemetry_ack
    failed_send_telemetry_req
    empty_payload
    cleanup_outdated

    // vote generator
    generator_broadcasts
    generator_replies
    generator_replies_discarded
    generator_spacing

    // hinting
    missing_block

    // bootstrap server
    response
    write_error
    blocks
    drop
    response_blocks
    response_account_info
    channel_full

    // backlog
    activated

    // active
    insert
    insert_failed

    // unchecked
    put
    satisfied
    trigger

    // election scheduler
    insert_manual
    insert_priority
    insert_priority_success
    erase_oldest

    // handshake
    invalid_node_id
    missing_cookie
    invalid_genesis

    // bootstrap ascending
    missing_tag
    reply
    throttled
    track
    timeout
    nothing_new

    // bootstrap ascending connections
    connect
    reuse

    // bootstrap ascending accounts
    prioritize
    prioritize_failed
    block
    unblock
    unblock_failed

    next_priority
    next_database
    next_none

    blocking_insert
    blocking_erase_overflow
    priority_insert
    priority_erase_threshold
    priority_erase_block
    priority_erase_overflow
    deprioritize
    deprioritize_failed

dir (direction) :
    in
    out

previous versions up to 24.0

type:
    traffic_udp
    traffic_tcp
    error
    message
    block
    ledger
    rollback
    bootstrap
    vote
    election
    http_callback
    peering
    ipc
    tcp
    udp
    confirmation_height
    confirmation_observer
    drop
    aggregator
    requests
    filter
    telemetry

details:
    all

    // error specific
    bad_sender
    insufficient_work
    http_callback
    unreachable_host

    // confirmation_observer specific
    active_quorum
    active_conf_height
    inactive_conf_height

    // ledger block bootstrap
    send
    receive
    open
    change
    state_block
    epoch_block
    fork
    old
    gap_previous
    gap_source

    // message specific
    keepalive
    publish
    republish_vote
    confirm_req
    confirm_ack
    node_id_handshake
    telemetry_req
    telemetry_ack

    // bootstrap callback
    initiate
    initiate_lazy
    initiate_wallet_lazy

    // bootstrap specific
    bulk_pull
    bulk_pull_account
    bulk_pull_deserialize_receive_block
    bulk_pull_error_starting_request
    bulk_pull_failed_account
    bulk_pull_receive_block_failure
    bulk_pull_request_failure
    bulk_push
    frontier_req
    frontier_confirmation_failed
    frontier_confirmation_successful
    error_socket_close

    // vote specific
    vote_valid
    vote_replay
    vote_indeterminate
    vote_invalid
    vote_overflow

    // election specific
    vote_new
    vote_cached
    late_block
    late_block_seconds
    election_non_priority
    election_priority
    election_block_conflict
    election_difficulty_update
    election_drop
    election_restart

    // udp
    blocking
    overflow
    invalid_magic
    invalid_network
    invalid_header
    invalid_message_type
    invalid_keepalive_message
    invalid_publish_message
    invalid_confirm_req_message
    invalid_confirm_ack_message
    invalid_node_id_handshake_message
    invalid_telemetry_req_message
    invalid_telemetry_ack_message
    outdated_version

    // tcp
    tcp_accept_success
    tcp_accept_failure
    tcp_write_drop
    tcp_write_no_socket_drop
    tcp_excluded

    // ipc
    invocations

    // peering
    handshake

    // confirmation height
    blocks_confirmed
    blocks_confirmed_unbounded
    blocks_confirmed_bounded
    invalid_block

    // [request] aggregator
    aggregator_accepted
    aggregator_dropped

    // requests
    requests_cached_hashes
    requests_generated_hashes
    requests_cached_votes
    requests_generated_votes
    requests_cannot_vote
    requests_unknown

    // duplicate
    duplicate_publish

    // telemetry
    invalid_signature
    different_genesis_hash
    node_id_mismatch
    request_within_protection_cache_zone
    no_response_received
    unsolicited_telemetry_ack
    failed_send_telemetry_req

dir (direction) :
    in
    out

RPC Command

Counters query:

{
    "action": "stats",
    "type": "counters"
}

Counters response

{
    "type": "counters",
    "created": "2018.03.29 01:46:36",
    "entries": [
        {
            "time": "01:46:36",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "3122792"
        },
        {
            "time": "01:46:36",
            "type": "traffic",
            "detail": "all",
            "dir": "out",
            "value": "203184"
        },
        {
            "time": "01:46:36",
            "type": "message",
            "detail": "all",
            "dir": "in",
            "value": "12494"
        },
        {
            "time": "01:46:36",
            "type": "message",
            "detail": "all",
            "dir": "out",
            "value": "1380"
        },
        {
            "time": "01:46:36",
            "type": "message",
            "detail": "keepalive",
            "dir": "in",
            "value": "172"
        },
        ...
    ]
}

Samples query:

{
    "action": "stats",
    "type": "samples"
}

Samples response

{
    "type": "samples",
    "created": "2018.03.29 01:47:08",
    "entries": [
        {
            "time": "01:47:04",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "59480"
        },
        {
            "time": "01:47:05",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "44496"
        },
        {
            "time": "01:47:06",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "44136"
        },
        {
            "time": "01:47:07",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "18784"
        },
        {
            "time": "01:47:08",
            "type": "traffic",
            "detail": "all",
            "dir": "in",
            "value": "22680"
        },
        {
            "time": "01:47:03",
            "type": "traffic",
            "detail": "all",
            "dir": "out",
            "value": "4128"
        },
        {
            "time": "01:47:04",
            "type": "message",
            "detail": "all",
            "dir": "out",
            "value": "17"
        },
        {
            "time": "01:47:05",
            "type": "message",
            "detail": "all",
            "dir": "out",
            "value": "10"
        },
        ...
    ]
}

Log file example

counters.stat

As specified in the example config, sampling interval is 1 second, stats are logged every 5 seconds, and the file rotates after 5 log cycles.

counters,2018.03.29 01:45:36
01:44:56,bootstrap,all,out,1
01:45:36,bootstrap,initiate,out,2
counters,2018.03.29 01:45:41
01:45:41,traffic,all,in,456344
01:45:41,traffic,all,out,189520
01:45:41,message,all,in,1925
01:45:41,message,all,out,1289
01:45:38,message,keepalive,in,165
01:45:41,message,keepalive,out,1027
01:45:41,message,publish,in,34
01:45:38,message,confirm_req,in,164
01:45:41,message,confirm_req,out,262
01:45:41,message,confirm_ack,in,1562
01:45:36,bootstrap,all,out,2
01:45:41,bootstrap,initiate,out,3

samples.stat

As specified in the example config, logging is done every 5 seconds and the sampling capacity is 5 (how many samplings are kept)

samples,2018.03.29 01:45:36
01:45:36,bootstrap,initiate,out,2
samples,2018.03.29 01:45:41
01:45:37,traffic,all,in,322608
01:45:38,traffic,all,in,37064
01:45:39,traffic,all,in,38752
01:45:40,traffic,all,in,25632
01:45:38,traffic,all,out,185072
01:45:39,traffic,all,out,3072
01:45:41,traffic,all,out,920
01:45:37,message,all,in,1387
01:45:38,message,all,in,126
01:45:39,message,all,in,179
01:45:40,message,all,in,101
01:45:37,message,all,out,1254
01:45:38,message,all,out,10
01:45:39,message,all,out,16
01:45:41,message,all,out,6
01:45:38,message,keepalive,in,165
01:45:38,message,keepalive,out,1011
01:45:39,message,keepalive,out,12
01:45:41,message,keepalive,out,3
01:45:37,message,publish,in,19
01:45:38,message,publish,in,8
01:45:40,message,publish,in,3
01:45:41,message,publish,in,4
01:45:38,message,confirm_req,in,164
01:45:37,message,confirm_req,out,249
01:45:38,message,confirm_req,out,3
01:45:39,message,confirm_req,out,6
01:45:41,message,confirm_req,out,3
01:45:37,message,confirm_ack,in,1046
01:45:38,message,confirm_ack,in,141
01:45:39,message,confirm_ack,in,150
01:45:40,message,confirm_ack,in,100
01:45:36,bootstrap,all,out,2
01:45:36,bootstrap,initiate,out,2
01:45:41,bootstrap,initiate,out,1

Troubleshooting UPnP

Ensure UPnP is enabled

UPnP will be enabled unless the external port is set in either the config

[node]
...
# The external address of this node (NAT). If not set, the node will request this information via UPnP.
# type:string,ip
external_address = "::ffff:<some_public_ipv4>"
or via cli flag
--config node.external_address="::ffff:<some_public_ipv4>"

Enable UPnP logging

Appending this to your launch command will enable upnp debug logging.

#V27 or later
--config log.console.upnp=debug
# V26 or before
--config node.logging.upnp_details=true

Error UPnP Messages

Check the beginning of the logs for UPNP_* messages

Port Mapping Conflict

Check for static routes

[2019-Oct-29 11:06:56.641389]: UPnP failed 718: ConflictInMappingEntry
[2019-Oct-29 11:06:56.644387]: UPnP failed 718: ConflictInMappingEntry

Normal UPnP Messages

[2019-Oct-29 11:06:56.641389]: UPNP_GetSpecificPortMappingEntry failed 714: NoSuchEntryInArray
[2019-Oct-29 11:06:56.644387]: UPNP_GetSpecificPortMappingEntry failed 714: NoSuchEntryInArray
This message is expected when starting the node and will go away after the UPnP has mappeded the port