libargus fails on re-entry if killed

Libargus does not appear to be re-entrant when the process using it is suddenly halted.

This is particularily inconvenient when debugging an application. If we stop the debugger, without shutting down the library cleanly, libargus is not usable until the system is rebooted.

Ideally, we could step through a debugger at leisure, and terminate the process if necessary. Subsequent debug launches should be possible without a reboot.

Here is a very simple example force-terminating argus_camera to demonstrate, although the behaviour is the same terminating/halting a debugger for any libargus application. This is on R32.2, although the issue has been around for previous releases as well.

nvidia@jetson:/usr/src/tegra_multimedia_api/argus/apps/camera/ui/camera$ ./argus_camera &
[1] 7729
nvidia@jetson:/usr/src/tegra_multimedia_api/argus/apps/camera/ui/camera$ Executing Argus Sample Application (argus_camera)
Argus Version: 0.97.3 (multi-process)
sudo kill -9 7729
[sudo] password for nvidia:
[1]   Killed

Application has been terminated, and we fail to re-launch until we reboot:

nvidia@jetson:/usr/src/tegra_multimedia_api/argus/apps/camera/ui/camera$ ./argus_camera &
[2] 7805
nvidia@jetson:/usr/src/tegra_multimedia_api/argus/apps/camera/ui/camera$ Executing Argus Sample Application (argus_camera)
(Argus) Error FileOperationFailed: Failed socket read: Connection reset by peer (in src/rpc/socket/common/SocketUtils.cpp, function readSocket(), line 79)
(Argus) Error FileOperationFailed:  (propagating from src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 215)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, Dispatcher:784 (propagating)
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
(Argus) Error FileOperationFailed: Connecting to nvargus-daemon failed: Connection refused (in src/rpc/socket/client/SocketClientDispatch.cpp, function openSocketConnection(), line 201)
(Argus) Error FileOperationFailed: Cannot create camera provider (in src/rpc/socket/client/SocketClientDispatch.cpp, function createCameraProvider(), line 102)
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, initialize:823 Failed to create CameraProvider
Error generated. /usr/src/tegra_multimedia_api/argus/apps/camera/modules/Dispatcher.cpp, getInstance:807 Initalization failed
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

Not sure, but you may try to restart nvargus-daemon:

sudo systemctl restart nvargus-daemon

If restart still not working kill the nvargus-daemon and run it manually by sudo again.

Thanks for the response. It’s an ugly way to solve the problem, but better than nothing :)

As a feature request, it would be nice to be to debug when using libargus without the library producing failures after stopping at breakpoints.