Understand the v2rayN startup chain first
After you click Start, v2rayN does not establish a proxy connection immediately. It first reads the current server, routing, DNS, and local port settings, generates a configuration for the core, and then starts the Xray or V2Ray core process. The core reads the configuration and listens on the local port before attempting to connect to the remote server.
That is why “the core failed to start” and “the core is running but websites will not open” are two different problems. The first usually appears as a process that exits immediately, a tray status that quickly returns to its previous state, or configuration parsing and listener errors in the log. In the second case, the local SOCKS or HTTP port is often already listening, while the failure occurs during the handshake, DNS resolution, or routing.
Start troubleshooting by answering three questions:
- Did the core process actually start and remain running?
- Did the local proxy port successfully start listening?
- Did the first fatal error occur while reading the configuration, listening on a port, or connecting to the remote server?
Open the log window and capture one complete startup attempt
Open the log panel or log window in the v2rayN main window, then stop the current core. Once the view is clear, select the target server again and start it once—do not keep clicking Start. Repeated attempts mix multiple runs together and may leave a briefly surviving old process, making port conflicts harder to diagnose.
When reading the log, first confirm that the timestamps match the operation you just performed. Then distinguish v2rayN output from core output. The interface generates the configuration and launches the process; Xray and V2Ray output is usually closer to the actual failure point. Common clues generally fall into these groups:
- Configuration parsing: Look for keywords such as invalid, failed to parse, unexpected, and unknown field.
- Port listening: Look for bind, listen, address already in use, or access denied.
- Protocol parameters: Look for field names such as UUID, security, flow, transport, Reality, and TLS.
- Files and processes: Look for file not found, permission denied, cannot execute, or path errors.
- Remote connection: Look for timeout, connection refused, handshake, certificate, or failed DNS queries.
If the log only shows “process exited” or an exit code, scroll up several lines. An exit code confirms that the process did not finish normally, but it may not identify the problematic field. The actionable detail is usually above it. You can also temporarily increase the log level, but restore the usual level after fixing the issue so excessive debugging output does not hide the important error.
Before sharing logs with a maintainer, remove subscription URLs, server addresses, user identifiers, passwords, Reality public-key configuration, and complete share links. The error type, field names, sequence of events, client version, and core type are usually enough to locate the problem.
Seeing bind or address already in use: resolve port conflicts
v2rayN needs to listen on local entry ports such as SOCKS and HTTP. If another program, an old core process, or a second v2rayN instance already uses the same port, the new process exits immediately. The log often shows bind failed, address already in use, or a system message saying that a socket address can only be used once.
First note the current local port in v2rayN settings. The port is not always a fixed number, so use the value shown in the current interface and generated configuration. In a Windows terminal, use the commands below to identify the process using it, replacing the example port with the actual value:
netstat -ano | findstr :10808
tasklist /FI "PID eq process ID"
The first command displays the process ID at the end; the second uses it to look up the program name. If the process is a leftover core from a previous abnormal exit, stop the core normally from v2rayN and then confirm that the process has exited. If another proxy tool or local development service owns the port, close the conflicting program or switch v2rayN to an unused port.
After changing the port, also check your browser, terminal environment variables, and applications that require manual proxy settings. The core may start successfully while an application still points to the old port, creating a second-layer failure where startup succeeds but access does not. Do not randomly change several ports to work around a conflict; change one item at a time and record the before-and-after values.
Seeing parse or invalid character: fix JSON and rule structure
v2rayN normally generates a configuration from the options selected in the interface. Custom configurations, manually edited outbounds, complex routing rules, or incomplete imported content can produce JSON that the core cannot parse. Typical log messages include unexpected end, invalid character, failed to parse config, unknown field, and cannot unmarshal.
unexpected end often means the content was truncated, such as a missing closing brace or bracket. invalid character often points to an extra comma, Chinese punctuation, incorrect quotation marks, or a comment that should not be there. JSON keys and strings must use English double quotation marks; do not leave a trailing comma after the last item or write comments directly in the file.
A structure like the following fails because of the trailing comma:
{
"log": {
"loglevel": "warning",
}
}
When fixing the issue, do not focus only on the line number reported by the log. Parsers often report the position where they confirm that reading cannot continue, while the missing symbol may be on the previous line. First check whether commas, quotation marks, and brackets before and after the reported line are properly paired. Then check field types. For example, a port expected to be a number should not be written as text containing extra characters.
Routing configurations can also be structurally valid while containing invalid field values. Domain rules, IP rules, and outbound tags serve different purposes; if a rule references a nonexistent outboundTag, the core may reject the configuration or fail to route traffic as intended at runtime. If the error began after adding a rule, disable the most recently added rule and restart instead of deleting the entire subscription at once.
When using a custom configuration, the safest approach is to keep a backup of the original file and add DNS, routing, and outbounds incrementally from the smallest working structure. Start the core after each addition. This narrows the problem to the latest change instead of leaving you guessing through hundreds of lines of configuration.
The configuration parses, but the protocol parameters do not match
Valid JSON does not mean the connection parameters are correct. VMess and VLESS are different protocols, and their authentication fields, transport settings, and encryption-related options cannot be interchanged. After importing a subscription, v2rayN generates an outbound configuration for each entry. If the subscription is outdated, fields are missing, or the wrong protocol was selected during manual editing, the log may report invalid parameters during startup checks or the first connection attempt.
Check the VLESS entry
For a VLESS entry, verify at least the server address, port, user identifier, transport, and security layer. With REALITY, also verify that serverName, public key, shortId, fingerprint, and flow match the information provided by the server. Common flow values depend on the specific transport combination; do not copy a value simply because another node uses it.
If the log mentions unsupported flow, invalid public key, or Reality handshake, return to the subscription source and update the entry instead of guessing at missing fields. A resolvable server address and reachable port only prove that the network can reach the target; they do not prove that the REALITY parameters match.
Check the VMess entry
VMess also depends on the correct user identifier, port, and transport parameters. Older configurations may contain legacy fields such as alterId, while newer servers generally use different recommended settings. Base the client entry on the current server configuration, and do not combine parameters from an old node with a new one. If only one VMess node fails after a subscription update, duplicate it for comparison, but do not modify the original and lose your reference.
Check the transport layer
TCP, WebSocket, and gRPC use different fields. WebSocket commonly involves a path and Host; gRPC uses a service name; TLS also involves serverName. An extra slash in the path, different capitalization in the service name, or an incorrect Host can let the core start normally but cause failure during the handshake.
To determine whether the problem is with a node or the global configuration, test another known-working server from the same subscription. If every node fails before the core starts, prioritize local configuration, ports, and core files. If only one server fails during connection, first verify that entry’s protocol parameters and the server’s status.
Check the core type, file path, and read/write permissions
v2rayN is a management interface; actual network processing is handled by the Xray or V2Ray core. Some protocol capabilities and fields are supported only by specific core versions. If the log shows unknown field, unsupported security, or an unrecognized Reality setting, first confirm the core type selected for the entry, then verify that the core version supports the required capability.
Do not hide configuration errors by repeatedly switching cores. VLESS with REALITY generally requires matching Xray capabilities, while ordinary VMess configurations must still use fields supported by the selected core. If switching cores changes the error from “unknown field” to “handshake failed,” the configuration has reached the next stage, but the remote parameters still need verification.
file not found or cannot execute usually points to a missing core file, a changed path, or a program without execute permission. First confirm the core directory in v2rayN settings, then check that the relevant file actually exists. If you moved the entire program directory, copied only some files, or upgraded by overwriting an old version, the path saved by the interface may still point to the original location.
The configuration directory must also be writable. Before starting the core, v2rayN generates a temporary or runtime configuration; if the program is located somewhere the current account cannot write to, startup may fail before the core launches. Move the program to a directory that the current user can read and write normally, restart it, and check whether the log can generate the configuration. Do not use elevated privileges as a long-term workaround: this can change file ownership and create new read/write differences during subsequent normal launches.
When security software or system policies block a process, the log may show only a startup failure or file-access error. Check the system security records to identify the exact blocked file and rule, then decide whether to allow the program to run. Do not disable the entire security suite for testing; narrowing the exception to a specific file, directory, or process is easier to undo and makes the cause clearer.
A repeatable troubleshooting sequence
Changing the port, node, routing, and DNS at the same time makes results impossible to compare. Follow the sequence below, restarting once after each step and recording the first error in the log.
- Preserve the evidence. Record the v2rayN version, core type, target server label, local port, and first error. Remove sensitive connection details before copying the log.
- Stop old processes. Stop the core from the interface, confirm that there is no second v2rayN instance, and make sure no leftover core is still listening on the same port.
- Check local listeners. If you see bind or access denied, resolve the port and permission issue first instead of changing remote protocol parameters prematurely.
- Undo recent changes. Temporarily disable newly added custom routing, DNS, or outbound settings and restore the state from before the change.
- Update the subscription. Run an update for an existing subscription group, then select an entry from the updated list. Do not import a subscription URL as a single-node share link.
- Test another server of the same type. Separate a single-node parameter error from a global configuration error while keeping the local port and routing unchanged.
- Verify core capabilities. When you see unknown field or unsupported, confirm that the protocol capabilities required by the entry match the current core.
- Restore routing settings. Once the core runs reliably, re-enable routing and DNS one group at a time. Restore only one set of rules per change.
To create a minimal test environment, temporarily use the default routing, default DNS, and one server whose parameters are known to be complete, while disabling extra custom inbounds and outbounds. Once the minimal configuration starts, add the subscription group, domain routing, IP rules, and custom DNS in sequence. The step where the problem appears identifies the affected configuration group.
FAQ
Why does the core still exit immediately after updating the subscription?
A subscription update refreshes server entries; it does not automatically fix local port conflicts, custom routing syntax, the core path, or directory permissions. First identify which stage the first error belongs to. If it is still bind failed, fix the local listener instead of repeatedly refreshing the subscription.
What should I do if the log shows only an exit code and no specific field?
First look above the core’s exit record and confirm that the log level is not set too low. Stop the core and start it only once to avoid overlapping entries. If the interface log is still incomplete, check whether v2rayN’s log directory and runtime configuration were generated successfully; generation failures usually point to a path or write-permission problem.
Is it the same problem if the core starts but the browser still cannot open websites?
Not exactly. If the core continues running and the local port is listening, the startup stage has essentially passed. Next check whether the system proxy is enabled, whether the browser reads system settings, whether DNS is working as configured, and whether the current routing sends the target domain to the correct outbound.
Where should I start if all nodes fail at the same time?
Start with global factors: the local port, core files, configuration directory, custom DNS, and routing. When multiple servers show the same configuration parsing error at the same time, the nodes are usually not all damaged individually; the shared local settings are more likely at fault.
Would deleting all configurations and reinstalling be faster?
Clearing everything immediately removes useful comparison data and may not reveal the real cause. Back up the current configuration first, then create a minimal test configuration. Once it works, migrate the subscription and rules one item at a time. This both isolates the problem and prevents the original error from being copied wholesale into the new environment.