At a Glance

When the core fails to start, first determine whether the issue is a config parse error, a local listener failure, or a network connection problem after startup. This guide is for users whose v2rayN core exits or whose v2rayNG service won’t start. Use logs from a single startup attempt to check JSON, protocol fields, listening ports, and rule data files, then verify the fix by checking the local listener and making a test request.

1. First, Check Whether the Core Failed to Start or Requests Can’t Connect

v2rayN provides the client interface; cores such as Xray and V2Fly read the config, set up inbound listeners, and make outbound connections. Being able to open the interface or update subscriptions doesn’t mean the core is running. Likewise, a webpage failing to load doesn’t necessarily mean the core failed to start: remote timeouts, certificate verification errors, and DNS lookup failures can all occur after startup.

Read config Parse fields Load resources Start local listener Connect outbound

This sequence helps identify the stage where an error occurs; it isn’t a precise account of the internal call order for every core version. Start with the most specific cause in the startup failure log. If the core is still running and you then see connection refused or i/o timeout, check the destination to determine whether the issue is local or remote. Don’t assume it’s a JSON error.

2. Capture a Complete Startup Log

Capture the log from before you click Start through the point where the error appears. Don’t just screenshot “startup failed”—that message is usually only the outcome. The actual cause is often in a following failed to message, filename, or system error. Repeated startup attempts can mix logs from multiple runs, so stop the service and reproduce the issue once.

  1. Record your environment

    Note your operating system, client version, and the core name and version currently in use. v2rayNG uses Xray; v2flyNG uses V2Fly. In v2rayN, check which core is selected rather than inferring it from the window title.

  2. Open the logs

    In v2rayN, check the log area at the bottom of the main window. Expand the log panel if it’s collapsed. In v2rayNG, open “Logs” from the main menu. Menu locations may vary by version, so follow the labels in your current interface.

  3. Reproduce once

    Stop the connection, note the current time, and start it once. Keep the continuous log from before and after startup. Save the first failure message and its full cause chain, not just the last line.

  4. Back up before editing

    Back up custom configs and routing rules, and change one variable at a time. Before sharing logs, redact subscription URLs, node credentials, UUIDs, server addresses, and personal directory names. Keep field names, error types, and ports visible.

If the client says it can’t create a core process and there’s no core output at all, first check whether the core executable exists, the archive was fully extracted, the system’s security logs show it was blocked, and the package matches your processor architecture. This happens before config parsing, so repeatedly changing node settings usually won’t help.

3. Port Already in Use: Find the Listening Process Before Changing Ports

A local proxy must bind to a listening address and port. Two independent listeners usually can’t use the same TCP port on the same address at the same time. A duplicate client instance, a leftover core process, or another application using the same port can make the new core exit immediately. Don’t confuse the remote server port with the local inbound port.

Error: bind: address already in use

Cause: The target listening address and port are already in use. Fix: Identify the process using the port and close any duplicate instance normally. If both programs need to run at once, assign them different local listening ports.

Error: Only one usage of each socket address (protocol/network address/port) is normally permitted.

Cause: Windows won’t allow the same socket address to be bound twice. Fix: Find the port in the log, then use the listener list to identify the process. Don’t terminate a system process if you can’t identify it.

10808
Example local TCP port in this section
10818
Example port to use after confirming it’s free
1 item
Change one setting at a time

These values are examples for troubleshooting, not defaults for every version. If the log shows a bind failure on 127.0.0.1:10808, run the command below in Windows PowerShell to find the process ID using the port, then look up the process name.

Get-NetTCPConnection -State Listen -LocalPort 10808 |
  Select-Object LocalAddress, LocalPort, OwningProcess

Get-Process -Id (Get-NetTCPConnection -State Listen -LocalPort 10808).OwningProcess

On Linux, run ss -ltnp 'sport = :10808'; on macOS, run lsof -nP -iTCP:10808 -sTCP:LISTEN. No results only mean there was no matching TCP listener at the time of the query. It doesn’t rule out a startup-time conflict, a UDP conflict, or a permissions issue; check the network type in the log.

4. JSON Errors: Distinguish Invalid Syntax from Incompatible Fields

Strict JSON requires English double quotes around keys and strings, and commas must be placed correctly between arrays and objects. Curly quotes, a trailing comma, or a missing bracket after copying can all cause a read-time failure. Some config loaders support extensions such as comments, but others may not. To avoid compatibility issues, use strict JSON in your troubleshooting copy.

Error: invalid character '}' looking for beginning of object key string

Cause: The object structure doesn’t meet the parser’s requirements, often because of an extra comma after the last field. Fix: Check around the reported position and the preceding line, remove the trailing comma, and make sure the brackets and braces match.

Error: unexpected EOF

Cause: The input ends before an object, array, or string is complete. Fix: Check whether the file was copied in full or the download was interrupted, then restore the missing structure. Don’t blindly add closing brackets to the end of the file.

The snippet below illustrates JSON syntax; it isn’t a complete proxy config you can run as-is. There’s no trailing comma after loglevel, and both the outer and inner objects are closed:

{
  "log": {
    "loglevel": "warning"
  }
}

Passing a JSON syntax check only proves that the text is valid JSON. It doesn’t confirm that the protocol name, transport settings, or field types are correct. Some unrecognized fields may also be ignored rather than causing startup errors. Continue by testing the config with the core you actually use.

.\xray.exe run -test -config .\config.json

5. Unknown Protocols and Fields: Check Which Core Is Running

Share links, subscription content, and native configs are different types of input. A vless:// or vmess:// share link must be parsed by the client; you can’t save it directly as a JSON config for the core to read. A node appearing in your subscription list also doesn’t mean the current core supports all its transport and security settings.

Error: unknown outbound protocol

Cause: The outbound protocol name is misspelled or isn’t recognized by the current core. Fix: Check the protocol field in outbounds, confirm the core name and version, then correct the config or use a compatible core.

Error: json: cannot unmarshal string into Go value of type uint32

Cause: A field that should be numeric was entered as a string. The expected type and wording vary by core implementation. Fix: Check the field type mentioned in the log. For example, write a numeric port as 443, not "443".

VLESS is a protocol name; REALITY is part of the related security configuration. They aren’t interchangeable as the value of protocol. The transport, security settings, server name, and credentials must match the server requirements. Changing the protocol name to one that starts successfully doesn’t mean the node will connect.

6. Missing Geo Files: Check Data Names, Paths, and Rule References

Routing references such as geosite: and geoip: depend on the corresponding data. Even with valid config syntax, rule building can fail if the runtime can’t find the data files or the data doesn’t contain the referenced category. First check whether the error says the file can’t be opened or the category can’t be found; the fixes are different.

Error: failed to load geosite

Cause: Domain rule data couldn’t be loaded. The file may be missing or damaged, the path may be wrong, or the category may not exist. Fix: Read the following error details and check the resource directory and rule categories used by the current core.

Error: no such file or directory

Cause: The path in the log doesn’t exist. Treat this as a geo resource issue only if the path points to a geo data file. Fix: Check the full file path, filename capitalization, and extracted directory structure. Restore the resource using the client’s data management method.

  1. Note the filename in the error, such as geosite.dat or geoip.dat, along with the full path. Don’t guess where resources are stored based only on the client’s install directory.
  2. Make sure the file is readable and isn’t empty. Linux filenames are case-sensitive, and directory permissions can also prevent the core from reading a file.
  3. Restore the compatible data files using the client’s data update option. If there’s no such option in the interface, follow the client’s resource management method. Don’t mix data files in different formats.
  4. If the file exists but the log says the category wasn’t found, check the spelling after geosite: and confirm the category is present in the current data. Not every data file includes third-party categories.
  5. Back up your config, temporarily remove the single problematic rule, and try starting again. If startup succeeds, you’ve narrowed the issue to that rule or resource. Restore the complete data and rule before using the final config.

Removing all routing rules during troubleshooting changes where requests go: traffic meant to connect directly may be sent through the proxy, or proxy traffic may go direct. Once you’ve identified the issue, restore your original routing intent and check that outboundTag matches an existing outbound tag.

7. Android Service Issues and Post-Fix Checks

On Android, v2rayNG uses the system VPN interface to handle traffic. A VPN authorization failure and an Xray config parse failure are different issues: for the former, check system permissions, other VPN services, and device policies; for the latter, use the logs to investigate JSON, protocol, or resource errors. v2flyNG uses the V2Fly core, but the same distinction applies.

After making a fix, retest with the same node and under the same conditions. First make sure the core stays running, then confirm the local listener or Android VPN service is working, and only then test webpage access. System proxy settings, VPN access, and the core process are separate stages; any one working on its own doesn’t prove the whole connection is working.

  1. Restart and verify

    Stop the service and start it again. Confirm the original error is gone. If a different error appears, continue troubleshooting at the stage it relates to.

  2. Check the connection

    On desktop, check the actual listening port and system proxy settings. On Android, check the VPN service and app scope. If the port changed, update all manually configured connection settings.

  3. Make a request

    Visit a known-working HTTPS page in your browser and watch the log for the corresponding request. If the only error is a remote timeout, investigate the node and network instead of repeatedly changing JSON punctuation.

  4. Restore your settings

    Restore any routing and log-level settings you temporarily changed during troubleshooting, then save a copy of the final config. Record the original error, what you changed, and the verification result so you can compare after future updates.