Sytemdサービスによって開始されると、プログラムはセグメント化エラー(SEGV)で終了しました。

Sytemdサービスによって開始されると、プログラムはセグメント化エラー(SEGV)で終了しました。

NVidia Xavier NXに接続されたUSBカメラを制御するためのプログラムを作成しました。プログラムは正常に実行され、次のコマンドを使用して手動で実行すると、期待どおりに動作します。

./<name-of-the-executable> -cfg <path-to-config-file.json>

プログラムは、ユーザーまたは root で始まるかどうかにかかわらず実行されます。その後、アプリケーションの実行プロセスを自動化するスクリプトを作成しました。 USBトランスポート層ファイル(.ctおよび.xml)を指す環境変数をエクスポートし、実行中のアプリケーションを終了して完全に再起動し、実行可能ファイルディレクトリに変更してプログラムを実行したコマンドを実行します。

この.shスクリプトは、ユーザーまたはrootとして実行しても正しく機能します。今質問ここに表示されます:

起動時にサービスとしてプログラムを実行するために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が無効です!」行は、カメラポインターにアクセスできないことを示します。なぜこれが起こるのか、どう解決するのかわかりません。助けてくれてありがとう!

ベストアンサー1

おすすめ記事