First confirm that the core actually failed to start, then find the underlying cause in the log from that same launch. This guide is for users who can open the v2rayN window but see the core exit after enabling a node. It covers local ports, JSON syntax, protocol and core compatibility, and file access—and explains which settings to change in the interface so you don't keep editing a config.json that gets regenerated.
Distinguish a Core Exit from a Connection Failure
v2rayN is a management interface; cores such as Xray and V2Fly read the configuration, listen on local ports, and establish outbound connections. The main window opening doesn't mean the core is running, and a website failing to load doesn't mean config.json is broken. Check the logs for configuration loading errors, listener failures, or process exits before deciding what to troubleshoot.
If the logs show the local inbound listener starting successfully, followed by a remote connection timeout, TLS handshake failure, or connection reset, focus on node settings and network connectivity instead. Changing the local port repeatedly won't fix a remote connection problem. The system proxy only routes app requests to a local listening port; it can't restart a core that's already exited.
- Startup failure: Right after enabling a node, you see
Failed to start,failed to load config files, or a port binding error, and the corresponding core process then exits. - Connection failure: The core keeps running, but errors such as
dial tcpori/o timeoutappear only when you try to access a website. Check the address and port referenced in the error. - Proxy entry issue: The core is running, but your browser is still using an old port or the app isn't using the system proxy. Check the proxy entry settings before changing the node protocol.
Capture the Full Error Chain from One Launch
Logs often combine the high-level failure with its underlying cause: the first part may say that configuration loading failed, while the rest identifies the field or port at fault. Copying only the final “process exited” message usually isn't enough to diagnose the problem. Save your current settings, then trigger a single startup so that batch tests or background updates don't muddy the logs.
-
Record the Versions
Open “Help” → “About” and note the v2rayN version. Also record the core name and version shown in the startup log. Keep the client and core versions separate; one can't stand in for the other.
-
Limit What You Run
Return to the log area at the bottom of the main window and note the current time. Don't run batch latency tests or update subscriptions yet. Select one node, then use “Set as active server” in the server list's right-click menu to trigger configuration loading.
-
Copy the Error Chain
Keep the core version line, configuration file path, first error, and the cause that follows from this launch. If the interface shows only an exit notice, check the log file for this run. Don't combine entries from different times.
-
Look for Key Terms
Look for
bind,invalid character,unknown config id, andAccess is deniedfirst. Continue through the error chain for the specific port, field, or file path involved.
Menu layouts and log settings may differ between v2rayN versions; the steps here refer to a commonly used Chinese-language interface. If field names differ, follow the current interface and startup log. Before sharing logs, redact subscription URLs, UUIDs, passwords, and personal directory names, but leave protocol names, error keywords, and local ports visible.
Fix bind Errors and Local Port Conflicts
Local ports are part of the inbound configuration. Two programs can't listen on the same TCP port at conflicting addresses. Running multiple v2rayN instances, a leftover core process, or another app using the same port can prevent a new core from starting. The ports below are examples for troubleshooting, not defaults for every version.
Error: bind: Only one usage of each socket address
Cause and fix: Windows reports a conflict on the listening address and port. Identify the process using the port, verify what it is, then close the duplicate instance or change v2rayN's local listening port.
Error: bind: An attempt was made to access a socket in a way forbidden by its access permissions
Cause and fix: The port may be in a system-reserved range or blocked by a security policy, even if no ordinary process is using it. Check reserved ports and security software logs, then choose an unrestricted local port.
Run these two commands in Windows Terminal. The first finds connection entries containing 10808; check the local address column and the LISTENING state. The second looks up the specified PID. Here, 4321 is only an example PID—replace it with the number returned by the first command.
netstat -ano | findstr ":10808"
tasklist /FI "PID eq 4321"
If the process using the port is another v2rayN instance or a leftover core, exit the relevant instances normally from the system tray, then reopen v2rayN. Don't terminate an unidentified system process. If you need to change the port, go to “Settings” → “Parameter settings” and find the local listening port option—for example, change 10808 to 10818. Save and restart the core, then update the system proxy and any apps where you entered the port manually.
Bottom Line: Fix the Listener Before Checking Nodes
When there's a clear local binding failure, get the target port listening first. Changing subscription groups or remote nodes won't free a local port held by another process.
Find Syntax and Type Errors in config.json
config.json is often a runtime configuration generated by v2rayN from node, routing, and parameter settings—not the subscription URL itself. Use the file path in the startup log; don't find an old copy by filename and start editing it. For a regular node, fix the settings in the interface first. Direct edits to a generated file may be overwritten the next time you switch nodes.
Error: invalid character '}' looking for beginning of object key string
Cause and fix: A common cause is an extra comma after the last item in an object, where the parser expects another field name. Check the commas, quotes, and brackets before the reported position, then correct the JSON structure.
Error: unexpected EOF
Cause and fix: The file may be truncated, or a string, object, or array may be missing its closing character. Check the end of the file and how it was saved, then restore a complete configuration from a backup.
Error: cannot unmarshal string into Go struct field
Cause and fix: A field expects a number, Boolean, or object but received a string. Follow the field path in the error and correct the value's type to match the configuration format supported by the current core.
This snippet illustrates JSON syntax differences only; it is not a standalone core configuration. The first line has an extra comma after the last property. The second line is valid JSON once that comma is removed. Whether a port can be a string depends on the configuration schema, so valid syntax alone doesn't guarantee a valid configuration.
Invalid snippet:
{"listen": "127.0.0.1", "port": 10808,}
Corrected snippet:
{"listen": "127.0.0.1", "port": 10808}
- Check the line and column: If the log includes a line number, column, or offset, inspect the text before that position. The problem often lies at the end of the previous item, not at the character itself.
- Distinguish syntax from schema: Missing quotes are a JSON syntax error; a field with the wrong type is a deserialization issue. An invalid field value may not be caught until the configuration is built.
- Check where the configuration comes from: For a regular node, make corrections in the node editor or parameter settings. For a custom configuration, back up the source file before checking it in a local editor. Don't upload a full configuration containing credentials to an online formatter.
Check Protocol Fields Against the Running Core
A configuration that parses as JSON may still use protocols or transport fields that the current core doesn't recognize. v2rayN provides the configuration interface, but support depends on the core and version used for this launch. Outbound, routing, or transport snippets copied by hand may come from different cores; similar field names don't make them interchangeable.
Error: unknown config id:
Cause and fix: During configuration building in Xray or V2Fly, a protocol or component identifier may be unregistered, misspelled, or unsupported by the current version. Check the identifier after the colon, its field, and whether the core supports it.
Error: failed to parse outbound detour config
Cause and fix: Outbound configuration building failed; this is only the high-level message. Read the following details and check the protocol name, server parameters, transport settings, and TLS or REALITY fields.
For example, REALITY is a security layer setting; reality isn't an outbound protocol. XTLS Vision requires a specific combination of settings and isn't a transport type you can enter arbitrarily. Xray and V2Fly don't support identical configurations. On Android, v2rayNG uses Xray and v2flyNG uses V2Fly, but that doesn't mean every snippet exported by either Android client will work with a desktop core.
- Use the startup log to confirm which core actually ran, rather than relying on the node or folder name.
- Go to “Settings” → “Parameter settings” and check the core selection options available in your version. If there are settings to choose a core by protocol, check the option for the node's protocol.
- Return to the node editor and check the protocol, transport, TLS, SNI, and flow. Use the details provided by the server; don't try unfamiliar fields just to clear an error.
- If the configuration requires newer core features, back up your settings first, then update the matching client and core components. Record the versions before and after updating, and avoid changing the protocol and routing at the same time.
Check File Access and Core Executables
If the logs never reach protocol parsing and instead report that a configuration can't be opened, a file can't be found, or a process can't be created, check the files and execution environment first. Mistaking this for a broken node can lead to pointless subscription deletion and group recreation.
Error: The system cannot find the file specified.
Cause and fix: A configuration, core executable, or referenced file is missing. Follow the error to the full path and check whether the file wasn't extracted, was moved, or was quarantined by security software.
Error: Access is denied.
Cause and fix: Access was denied when reading a configuration, writing a runtime file, or launching a program. Check the path and system security logs, then correct the directory permissions. Running as administrator all the time isn't a universal fix.
- Extract the files after exiting: Don't run the program from inside an archive preview window. When updating a portable version, exit normally first so an old process doesn't keep files in use and leave the update only partially applied.
- Check the system architecture: Choose the build for your system, such as x64 or ARM64. The main program opening successfully doesn't mean every core file in the folder matches your system.
- Check referenced files: If the error mentions
geoip.datorgeosite.dat, check that the rule data exists at the expected path. This is different from a DNS lookup failure for a remote server. - Keep security logs: If something is blocked, check which item was blocked and why. Don't disable the firewall or security protection entirely to troubleshoot.
Retest Startup, Listening, and Requests
Change one clearly identified cause at a time, then repeat the same verification steps. This makes it possible to tell whether the fix came from a port change, a configuration repair, or a core update, rather than mixing changes into a result you can't reproduce.
-
Restart the Core
Save your settings and reload the current node, then check the startup log for the new time range. Confirm that the original first error is gone instead of assuming it disappeared just because older entries scrolled out of view.
-
Check the Listener
Use
netstat -anoto check the actual port in your settings and confirm the PID belongs to the current core. If you changed the port to 10818, query 10818 as well. -
Test a Request
Set the system proxy again, run a real connection latency test for the current node, then open the target website in your browser. Check the access log to confirm the request went through the proxy, and verify the exit IP if needed.
Why Did My config.json Edits Disappear After I Switched Nodes?
v2rayN usually regenerates runtime configurations for regular nodes. Check the file path in the log, then change the source settings in the node editor or under “Settings” → “Parameter settings.” If you need a custom configuration, maintain a separate source file and keep a backup.
Can Updating Subscriptions Fix a Local Port Conflict?
No. Updating a subscription refreshes node information in the subscription group; it doesn't release a listening port held by another process. Check the PID using the port first. Update the subscription only if the node parameters themselves are outdated or missing.
Should I Reinstall After an Error Appears When I Enable TUN?
Turn off TUN first and test the same node for comparison. If the regular local proxy starts, check TUN permissions, the virtual network adapter, and routing settings. If both modes report the same JSON error, fix the shared configuration first.
The Core Stays Running, but the Real Connection Latency Test Still Fails. What Should I Do?
Continue troubleshooting the connection stage. Note the time of the test, check remote connection, DNS, and TLS errors, then verify the node address, port, SNI, and routing. To check the proxy entry, see system proxy settings and the real connection latency test guide.
When asking for help, include the client and core versions, system architecture, the complete error chain with sensitive details redacted, and the most recent single change you made. This narrows “startup failed” down to a verifiable field, port, or file without losing troubleshooting clues by reinstalling everything.