Skip to main content

Troubleshooting

Common errors encountered during installation, configuration, and integration, with fixes for each.

Installation Issuesโ€‹

cmake says "could not find Protobuf"โ€‹

Symptom: CMake fails during configuration with errors such as:

Could NOT find Protobuf

or

Protobuf_INCLUDE_DIR not found

Cause: Protobuf is either not installed, installed incorrectly, or CMake cannot locate the required version.

Fix:

Verify Protobuf installation:

protoc --version

If Protobuf is missing, install it using the platform-specific instructions in the Get Started guide.

Linux users building from source should refresh the linker cache after installation:

sudo ldconfig

Then rerun:

cmake ..

If multiple Protobuf versions are installed, remove older versions and rebuild using the recommended version from the Get Started guide.

See Get Started for the full installation procedure.

gRPC / Protobuf version conflictโ€‹

Symptom: Build errors referencing conflicting Protobuf headers or symbols.

Cause: A prior gRPC installation bundles its own Protobuf version, which conflicts with the version NSB needs.

Fix: Uninstall your existing gRPC installation before building. Rebuild Protobuf from source (see Get Started โ†’ Linux tab) and retry the NSB cmake configure step.

Python proto import failsโ€‹

Symptom: ModuleNotFoundError or ImportError when running import proto.nsb_pb2.

Cause: PYTHONPATH doesn't point at the generated proto stubs.

Fix:

export PYTHONPATH=/path/to/nsb_beta/build/generated/python:$PYTHONPATH

On Linux you can also copy the stubs directly:

cp -r build/generated/python/proto python/

See Configuration Reference and Python API Overview for setup details.

nsb_daemon: command not foundโ€‹

Symptom: Shell reports the binary doesn't exist after installation.

Cause: The binary isn't on your PATH โ€” this is expected, NSB doesn't add itself to PATH automatically.

Fix: Use the full path: [install_path]/nsb/bin/nsb_daemon (macOS) or /usr/local/nsb/bin/nsb_daemon (Linux). Or add the bin/ directory to your PATH.

Linux cmake missing targets after Abseil/Protobuf buildโ€‹

Symptom: cmake reports it cannot find absl::base, absl::log, or protobuf::libprotobuf even after building them from source.

Cause: The dynamic linker cache wasn't refreshed after installing the new libraries.

Fix:

sudo ldconfig

Run this after installing both Abseil and Protobuf, then re-run cmake. See Get Started โ†’ Linux tab for the full build sequence.

Runtime Issuesโ€‹

500+ clients fail to connect or behave erraticallyโ€‹

Symptom: Latency spikes dramatically, CPU usage caps near 77%, or new clients fail to register at very high node counts.

Cause: NSB2's multi-channel architecture uses 3 file descriptors per client (ctrl, send, recv). At 500 clients, this is 1,500 file descriptors โ€” exceeding the default OS limit of 1,024 on many systems. See Performance Evaluation for the full measured impact.

Fix: Raise your shell's file descriptor limit before starting the daemon:

ulimit -n 4096

This is a known environmental ceiling, not a fundamental design flaw โ€” see Deep Architecture โ†’ Multi-Channel Architecture for the architectural explanation.

No message received by the applicationโ€‹

Symptom: app.receive() returns None even though app.send() was called successfully.

Cause: The simulator wasn't running (or wasn't ready) when the application sent its message โ€” there was nothing to fetch() the payload.

Fix: Always start the simulator before the application. See the Quickstart startup order, and Database Settings โ†’ Startup Order for the full service startup sequence.

Redis port mismatch (5050 vs 6379)โ€‹

Symptom: use_db: true is set, but the daemon can't connect to Redis, or payloads aren't being cached.

Cause: Redis defaults to port 6379, but NSB's examples and guides use port 5050. If your redis-server startup command and your config.yaml db_port don't match, the daemon will fail to reach Redis.

Fix: Make sure both match:

redis-server --port 5050
database:
db_port: 5050

See Database Settings for the full field reference.

Simulator Integration Issuesโ€‹

Null byte (\00) in payload causes issuesโ€‹

Symptom: Payloads appear truncated or corrupted, specifically in OMNeT++ (without INET).

Cause: Some simulators โ€” notably pure OMNeT++ without INET โ€” don't properly handle null characters within std::string-based payloads. This is a known limitation under active development.

Fix: No complete fix yet. Avoid embedding null bytes in payloads if running OMNeT++ without INET, or use the INET-based integration instead, which handles this correctly via its chunk system. See OMNeT++ with INET.

OMNeT++ IDE not finding NSB headersโ€‹

Symptom: Build fails in the OMNeT++ IDE with "header not found" errors for nsb_client.h or similar.

Cause: The makefrag file is missing the NSB include/library injection.

Fix: Ensure your makefrag contains:

INCLUDE_PATH += $(shell pkg-config --cflags-only-I nsb)
LIBS += $(shell pkg-config --libs nsb)

Then Clean Local and Build Project again. See OMNeT++ Basic Integration for the full setup.

For issues not listed here, open a GitHub issue.