When the client shows “Startup failed,” the node itself may still be valid. Graphical clients such as v2rayN and v2rayNG first convert the node, routing, and local listener settings into a kernel configuration, then launch the Xray or v2fly kernel. If configuration generation, a listening port, a certificate file, or any field structure is invalid, the kernel process exits before establishing a proxy connection.
The effective approach is not to keep switching nodes, but to find the first error from this startup attempt. The end of a log often contains wrapper messages such as “failed to start,” “app/proxyman,” or an exit code; the real cause usually appears earlier. Fix the earliest clear error, restart once, and read the new log to avoid being distracted by cascading failures.
This guide is for users whose kernel will not start, whose client disconnects immediately, or whose log keeps reporting errors. Follow this order: confirm the log time, capture the first error, classify it as a port, JSON, field, or certificate issue, apply one fix, then regenerate the configuration and start again.
Capture the complete log from this startup attempt
The log must correspond to the startup action you just performed. Old entries may contain errors that have already been fixed, and searching only for prominent red lines can lead you to troubleshoot the wrong issue. First stop the kernel, note the current time, and start it once more. Then read downward from the timestamp closest to startup; pause at the first entry containing error, failed, invalid, or cannot.
v2rayN desktop
- Open the log panel at the bottom of the main window. If it is collapsed, expand the bottom information panel and switch to “Log”.
- Go to “Settings” → “Parameter settings” → “Basic settings” and make sure logging has not been completely disabled. Use
warningfor routine troubleshooting; temporarily switch toinfowhen you need to observe the configuration-loading process. - Click Stop service, wait about 2 seconds, then start the current configuration again. Copy the entries from the kernel version line through the process exit line.
- If the main window shows both client and kernel logs, prioritize entries containing
Xray,V2Ray,Core, or a configuration file path.
v2rayNG for Android
- Disconnect the current connection, then open “Log” from the menu in the upper-right corner of the main screen.
- Return to the main screen, select the target configuration, start it, and immediately go back to the log page.
- Start with the latest kernel startup entry. If the content scrolls too quickly, stop the connection first, then copy the entries generated by the most recent startup.
- When v2rayNG uses the Xray kernel, configuration validation, VLESS fields, and TLS errors are written directly by the kernel. The brief message at the top of the client only confirms the status and cannot replace the detailed log.
Port conflict: the kernel cannot create a local listener
After starting, the proxy kernel first creates a SOCKS, HTTP, or transparent-proxy listener on the local machine. A common v2rayN combination is 127.0.0.1:10808 and 127.0.0.1:10809. If an old kernel did not exit, another client is running, or another program is using the same port, the new process fails before it handles the remote node.
This issue is unrelated to server latency or VMess and VLESS parameters. If the error contains listen, bind, address, and a port number together, troubleshoot the local listener first. Do not keep switching nodes to test it: all nodes share the same local entry point, and switching nodes will not release the occupied port.
Error: failed to listen TCP on 127.0.0.1:10808
Cause and fix: The SOCKS listening port is already occupied by another process. Fully exit the old client and any leftover kernel process; if it still fails, change the local SOCKS port to 11808 under “Settings” → “Parameter settings” → “Basic settings,” save, and restart.
Error: bind: Only one usage of each socket address is normally permitted
Cause and fix: Two processes cannot listen on the same address and port at the same time. Check whether two v2rayN windows are open, terminate any leftover kernel process, and start again. Do not let two clients share 10808.
Error: bind: address already in use
Cause and fix: Another process is using the target port on Linux or macOS. Close that process, or change the SOCKS and HTTP listeners to 11808 and 11809, respectively, then update applications that use manual proxy settings.
What to check after changing the port
- The system proxy is usually updated automatically by v2rayN, but manual proxy settings in browsers and download tools are not.
- If you change the SOCKS port from
10808to11808, also change the proxy address configured inside the application to127.0.0.1:11808. - The port must be between
1and65535, and the SOCKS, HTTP, API, and LAN listeners must not use duplicate ports. - If the same error persists after changing the port, check the actual port shown in the log. The configuration may have been generated from a different configuration file, so the change has not reached the current kernel.
Bottom line: check the local machine first when you see bind
A startup error containing bind or address already in use occurs during local listener setup. Free or change the port before investigating the node protocol or remote server.
JSON syntax error: protocol validation has not started
V2Ray and Xray kernels typically read JSON configuration files. Graphical clients generate these files automatically, but importing a complete configuration, editing custom routing, merging fragments, or pasting advanced parameters can introduce missing commas, trailing commas, incorrect quotes, or unmatched brackets. A syntax-parsing failure means the kernel has not yet interpreted the details of VMess, VLESS, or routing rules.
Line and column numbers in the log provide the most direct location. For example, line 42 column 17 means the parser could not continue at line 42, column 17, though the actual mistake may be at the end of the previous line. Check both the reported position and the preceding line, especially commas between array elements and object fields.
{
"inbounds": [
{
"port": 10808,
"protocol": "socks"
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {}
}
]
}
Error: invalid character '}' looking for beginning of object key string
Cause and fix: The object may contain a trailing comma, or a field name may be missing double quotes. Check the line above the reported position, remove the extra trailing comma, and validate the configuration again.
Error: unexpected end of JSON input
Cause and fix: The configuration was truncated before it ended, commonly because a closing brace or bracket is missing. Match {} and [] by nesting level instead of blindly appending brackets at the end of the file.
Error: failed to load config files: invalid character
Cause and fix: The configuration contains a character that JSON does not accept, possibly Chinese punctuation, comments, or incorrect quotation marks. Replace full-width commas and quotes with half-width characters, and remove comments unsupported by standard JSON.
Recommended recovery order
- Back up the current custom configuration or routing rules; do not overwrite the only copy.
- If the error appears in a configuration generated from a subscription node, delete that node, refresh the subscription, then select the node and start again.
- If the error is in manually edited JSON, restore a minimal configuration that can start, then add routing, DNS, and transport settings one section at a time.
- Start once after adding each section. This limits the problem to the latest change instead of requiring a review of the entire file.
Field spelling and version incompatibility: valid syntax, invalid structure
A JSON file can parse successfully without matching the current kernel's data structure. Misspelled or incorrectly capitalized fields, misplaced nesting, or fields generated by a newer client that an older kernel does not recognize can trigger unknown field, failed to build config, or invalid value during configuration loading. Braces and commas are usually fine; focus instead on field names, protocol combinations, and the kernel version.
For example, VLESS flow, the transport-layer network, and the TLS-related serverName each have a fixed location. The kernel will not guess when a field uses a similar name or an outbound field is placed inside transport settings. A subscription parser may also ignore newer parameters because it is outdated, resulting in an incomplete configuration.
Error: unknown field "floww"
Cause and fix: The field is misspelled; floww is not a valid field. Return to the node editor and check the VLESS flow-control setting. Do not edit the temporary generated file directly, because the client will overwrite it on the next startup.
Error: failed to build config: invalid field rule
Cause and fix: A custom routing rule uses fields or nesting that do not match the current kernel structure. Temporarily disable the most recently added rule, confirm that the kernel starts, then restore rules one at a time by domain, IP, port, and outbound tag.
Error: failed to parse transport config
Cause and fix: The transport type and its parameters do not match—for example, selecting WebSocket while retaining fields specific to another transport. Edit the node again so the transport, path, hostname, and security settings form one consistent combination.
Distinguish node, subscription, and global errors
| Symptom | Priority check | Action |
|---|---|---|
| Only one node will not start | Missing or malformed fields in that node | Re-import the node and check its protocol, address, port, and transport parameters |
| Every node in the same subscription fails | Subscription parsing or client-version issue | Refresh the subscription, check the client and kernel versions, then regenerate the configuration |
| All subscription and manually added nodes fail | Global routing, DNS, listener, or kernel-file issue | Restore the default global settings and test startup with a minimal configuration |
| Failures began after updating the client | Old configuration fields do not match the new structure | Save the node and parameters again instead of continuing to use the old generated cache |
Bottom line: check fields for a single-node failure, and global settings when every node fails
The scope of the failure directly narrows what to inspect. When only one node fails, there is no need to reset all routing; when every node fails at once, do not modify server addresses one by one.
Certificates and TLS: check paths, names, and system time separately
Certificate-related startup errors mainly occur while loading local certificate files or initializing TLS settings. When the client is the outbound connection side, most nodes do not require users to select certificate files manually. If the configuration contains certificateFile, keyFile, or a local absolute path, confirm that the file exists and that the current process can read it.
Another class of errors occurs after the connection is established, such as a certificate name mismatch or an invalid certificate validity period. These entries may not make the kernel exit immediately, but they can still make the target node connection fail. First distinguish “unable to read a file during startup” from “remote certificate verification failed during connection”; the fixes are different.
Error: failed to load certificate > open certificate.crt: no such file or directory
Cause and fix: The certificate path in the configuration does not exist, or the relative path is based on the wrong working directory. Use a path to an existing file, or remove the unnecessary local certificate reference from the node configuration.
Error: x509: certificate is valid for example.com, not node.example.net
Cause and fix: The server name used for TLS verification does not match the certificate domain. Check the node's address and server-name field. Do not arbitrarily interchange the WebSocket Host, connection address, and TLS server name.
Error: x509: certificate has expired or is not yet valid
Cause and fix: The certificate is outside its validity period, or the device clock is significantly wrong. Enable automatic date and time-zone settings and synchronize the clock first; if the error remains after the time is correct, the server-side certificate configuration must be updated.
Error: failed to parse private key
Cause and fix: The private-key file content, format, or certificate pairing is invalid. A standard outbound client node should not normally load a server private key; check whether a complete server-side configuration was imported by mistake.
Three checks for certificate issues
- Check the time first: If the system date is off by several months, even a valid certificate may be considered not yet valid or already expired.
- Then check the name: The connection address can be an entry-point domain, but the TLS server name must match the server configuration and the certificate's covered names.
- Finally check the file: Check the file path only when the configuration explicitly uses a local certificate. A standard subscription node should not have certificate or private-key paths added without a reason.
Verify after fixing: make sure the old error has not become a new one
After fixing one issue, stop and restart the kernel completely. Merely switching nodes in the interface may leave the old process or generated configuration in use. The minimum signs of a successful startup are a listener-established or core-running message in the log, a process that does not exit immediately, an actively listening local port, and subsequent requests reaching the proxy outbound.
If the first error disappears but another one appears, the fix was not necessarily ineffective. Configuration loading is sequential: the parser checks the next stage only after passing the previous one. For example, fixing a JSON comma may reveal a field typo; freeing 10808 may expose a certificate-name error. Continue by classifying the new first error.
- Stop the kernel, wait about 2 seconds, and clearly separate the new and old log periods.
- Restart the same node without changing the port, protocol, routing, and DNS at the same time.
- Confirm that the original keywords no longer appear in the log, such as
bind,invalid character,unknown field, orx509. - Open a regular webpage, then check whether a new connection entry appears in the log.
- After confirming that one node works, restore additional settings such as custom routing, TUN, or LAN listening.
Do I need to fix every warning in the log?
No. First handle the first error or failed entry that causes the process to exit. Warnings about legacy fields, compatibility behavior, or DNS fallback may not prevent startup; judge them together with the connection result.
Every node says that 10808 is occupied. What should I do?
Fully exit duplicate client instances and leftover kernel processes, then temporarily change the SOCKS port under “Settings” → “Parameter settings” → “Basic settings” to 11808. If startup succeeds, the original port was occupied by another process.
How do I investigate an unknown field error that appeared after refreshing the subscription?
First update the client and its kernel, then refresh the subscription and generate the configuration again. If only some nodes fail, delete and re-import those nodes individually; if all fail, inspect global custom configuration and routing fragments.
v2rayNG only shows “Startup failed.” How can I find the details?
Disconnect, open “Log” from the upper-right menu, return to the main screen and start once more, then immediately check the latest entries. Copy about 10 lines before and after the first error instead of recording only the status-bar message.
Is the troubleshooting order different for v2flyNG?
The basic order is the same: confirm the log time first, then find the first configuration or listener error. The difference is that v2flyNG uses the v2fly kernel, so fields specific to Xray cannot be copied over directly; follow the output from the current kernel.
A reusable troubleshooting record
Client: v2rayN
Kernel: Xray
Time: 2026-07-31 14:26
Scope: All nodes
First error: failed to listen TCP on 127.0.0.1:10808
Change made: SOCKS port changed to 11808
Retest result: Kernel remained running; local listener established
Recording the client, kernel, time, failure scope, first error, and one change helps avoid repeated work. When a similar issue occurs, compare the keywords and failure scope first instead of reinstalling or resetting the entire configuration. The key to log-based troubleshooting is identifying the stage where the error occurred and testing only one variable per round.