NVidia Xavier NX에 연결된 USB 카메라를 제어하는 프로그램을 작성했습니다. 프로그램은 정상적으로 실행되며 다음 명령을 사용하여 수동으로 실행하면 예상대로 작동합니다.
./<name-of-the-executable> -cfg <path-to-config-file.json>
프로그램은 사용자 또는 루트로 시작하든 상관없이 실행됩니다. 그런 다음 애플리케이션 실행 프로세스를 자동화하는 스크립트를 작성했습니다. USB 전송 계층 파일(.ct 및 .xml)을 가리키는 환경 변수를 내보내고 실행 중인 애플리케이션을 종료하여 완전히 다시 시작한 다음 실행 파일 디렉터리로 변경하고 프로그램을 실행한 명령을 실행합니다.
이 .sh 스크립트는 사용자 또는 루트로 실행해도 올바르게 작동합니다. 지금질문여기에 표시됩니다:
시작 시 서비스로 프로그램을 실행하기 위해 systemd용 단위 파일을 생성할 때 SEGV 신호를 받고 프로그램이 중단됩니다. 서비스 파일은 다음과 같습니다.
[Unit]
Description=Alvium Camera
[Service]
Type=forking
User=ekin
ExecStartPre=/bin/bash -c '. /opt/ekinCameraController/alvium/SetGenTLPath.sh'
ExecStart=/opt/ekinCameraController/startAlviumCamera.sh
[Install]
WantedBy=multi-user.target
프로그램이 실행될 때 LWP(Lightweight Processes)를 생성하기 때문에 유형을 "forked"로 설정했지만 이것이 데몬 프로세스로 간주되는지는 모르겠습니다. 그러나 유형을 "Simple"로 변경해도 프로그램은 여전히 SEGV에서 중지됩니다.
gdb로 출력하여 coredumpctl을 확인했는데 결과는 다음과 같습니다.
coredumpctl gdb 8968
PID: 8968 (AlviumCameraCon)
UID: 1000 (ekin)
GID: 1000 (ekin)
Signal: 11 (SEGV)
Timestamp: Tue 2022-08-09 10:40:45 +03 (21s ago)
Command Line: ./AlviumCameraController -cfg alviumCamera.json -log 0
Executable: /opt/ekinCameraController/AlviumCameraController
Control Group: /system.slice/alviumCamera.service
Unit: alviumCamera.service
Slice: system.slice
Boot ID: 053bf5a1b2864c22ae5b157ec06d20a1
Machine ID: a3d9197b765643568af09eb2bd3e5ce7
Hostname: 4-6-rev2-NVMe
.
.
.
[New LWP 8976]
[New LWP 8977]
[New LWP 8974]
[New LWP 8975]
[New LWP 8978]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Core was generated by `./AlviumCameraController -cfg alviumCamera.json -log 0'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000007fa9b428a4 in AVT::VmbAPI::Feature::GetValue(long long&) const () from /media/sd/workspace/ekincameracontroller/lib/vimba/6.0/x64/gcc-arm/libVimbaCPP.so
[Current thread is 1 (Thread 0x7f8dff9e10 (LWP 8989))]
프로세스 역추적은 다음을 보여줍니다.
#0 0x0000007fa9b428a4 in ?? ()
#1 0x000000555bafb3b4 in AVT::VmbAPI::Examples::AlviumCam::PrepareCamera (this=0x5576cd80b0) at /media/sd/workspace/ekincameracontroller/src/Camera/Alvium/AlviumCam.cpp:891
#2 0x000000555bafc8a4 in std::operator<< <std::char_traits<char> > (__s=0x555bb28e58 "response: ", __out=...) at /usr/include/c++/7/ostream:561
#3 AVT::VmbAPI::Examples::AlviumCam::StartContinuousImageAcquisition (this=0x5576cd80b0, Config=...) at /media/sd/workspace/ekincameracontroller/src/Camera/Alvium/AlviumCam.cpp:531
#4 0x000000555bb01170 in std::operator<< <std::char_traits<char> > (__s=0x555bb292c8 " Format:", __out=...) at /usr/include/c++/7/ostream:561
#5 AVT::VmbAPI::Examples::PrintFrameInfo (pFrame=...) at /media/sd/workspace/ekincameracontroller/src/Camera/Alvium/FrameObserver.cpp:151
#6 0x0000007fa921be94 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
나는 이것들로부터 무엇을 얻어야 합니까? 이제 libVimbaCPP.so의 GetValue 함수가 호출이 유효하지 않음을 나타내는 메시지를 반환한다는 것을 알았습니다.
SP_ACCESS(pCamera)->GetFeatureByName(Name, feature);
SP_ACCESS는 다음과 같이 정의됩니다.
#define SP_ACCESS( sp ) (sp).get()
하지만 어떻게 진행해야 할지 모르겠습니다.
coredumpctl 메시지를 프로그램을 수동으로 실행할 때의 메시지와 비교하려면 다음 gdb 출력을 볼 수 있습니다.
PID: 8549 (AlviumCameraCon)
UID: 1000 (ekin)
GID: 1000 (ekin)
Signal: 6 (ABRT)
Timestamp: Tue 2022-08-09 10:37:35 +03 (58s ago)
Command Line: ./AlviumCameraController -cfg alviumCamera.json -log 0
Executable: /opt/ekinCameraController/AlviumCameraController
Control Group: /user.slice/user-1000.slice/session-6.scope
Unit: session-6.scope
Slice: user-1000.slice
Session: 6
Owner UID: 1000 (ekin)
Boot ID: 053bf5a1b2864c22ae5b157ec06d20a1
Machine ID: a3d9197b765643568af09eb2bd3e5ce7
Hostname: 4-6-rev2-NVMe
Storage: /var/lib/systemd/coredump/core.AlviumCameraCon.1000.053bf5a1b2864c22ae5b157ec06d20a1.8549.1660030655000000.lz4
Message: Process 8549 (AlviumCameraCon) of user 1000 dumped core.
.
.
.
[New LWP 8552]
[New LWP 8553]
[New LWP 8574]
[New LWP 8554]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Core was generated by `./AlviumCameraController -cfg alviumCamera.json -log 0'.
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7f7cfe0010 (LWP 8549))]
(gdb) quit
프로그램이 시스템에 의해 제어될 때 분할 오류가 발생하는 이유를 알아낼 수 있습니까? coredumpctl은 오류의 원인을 표시하지만 수정 방법을 모르겠습니다. 도움이 된다면 Journalctl의 자세한 내용은 다음과 같습니다.
...
Ağu 09 10:40:45 4-6-rev2-NVMe startAlviumCamera.sh[8967]: Parameter GainAutoMinis invalid!
Ağu 09 10:40:45 4-6-rev2-NVMe startAlviumCamera.sh[8967]: Parameter GainAutoMaxis invalid!
Ağu 09 10:40:45 4-6-rev2-NVMe startAlviumCamera.sh[8967]: Parameter Gammais invalid!
Ağu 09 10:40:45 4-6-rev2-NVMe startAlviumCamera.sh[8967]: 3 - Preparing camera 5.
Ağu 09 10:40:45 4-6-rev2-NVMe startAlviumCamera.sh[8967]: 3 - Preparing camera 6.
Ağu 09 10:40:46 4-6-rev2-NVMe startAlviumCamera.sh[8967]: /opt/ekinCameraController/startAlviumCamera.sh: line 22: 8968 Segmentation fault (core dumped) ./AlviumCameraController -cfg
Ağu 09 10:40:46 4-6-rev2-NVMe systemd[1]: alviumCamera.service: Control process exited, code=exited status=139
Ağu 09 10:40:46 4-6-rev2-NVMe systemd[1]: alviumCamera.service: Failed with result 'exit-code'.
Ağu 09 10:40:46 4-6-rev2-NVMe systemd[1]: Failed to start Alvium Camera.
"매개변수 X가 유효하지 않습니다!" 줄은 카메라 포인터에 접근할 수 없음을 나타냅니다. 왜 이런 일이 발생하는지, 어떻게 해결해야 하는지 모르겠습니다. 도움을 주시면 감사하겠습니다!