Sytemd 서비스에 의해 시작될 때 프로그램이 세그먼트화 오류(SEGV)로 종료되었습니다.

Sytemd 서비스에 의해 시작될 때 프로그램이 세그먼트화 오류(SEGV)로 종료되었습니다.

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가 유효하지 않습니다!" 줄은 카메라 포인터에 접근할 수 없음을 나타냅니다. 왜 이런 일이 발생하는지, 어떻게 해결해야 하는지 모르겠습니다. 도움을 주시면 감사하겠습니다!

관련 정보