Jadi saya memiliki program C yang saya jalankan dari Python. Tetapi saya mendapatkan kesalahan kesalahan segmentasi. ketika saya menjalankan program C sendiri, itu berjalan dengan baik. Program C menghubungkan sensor sidik jari menggunakan fprint lib.

#include <poll.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdio.h>
#include <libfprint/fprint.h>



int main(){

struct fp_dscv_dev **devices;
struct fp_dev *device;
struct fp_img **img;

int r;
r=fp_init();

if(r<0){
    printf("Error");
    return 1;
}

devices=fp_discover_devs();
if(devices){
    device=fp_dev_open(*devices);

    fp_dscv_devs_free(devices);
}
if(device==NULL){
    printf("NO Device\n");
    return 1;
}else{
    printf("Yes\n");
   
}


int caps;

caps=fp_dev_img_capture(device,0,img);

printf("bloody status %i \n",caps);

    //save the fingerprint image to file. ** this is the block that 
     causes the segmentation fault.

    int imrstx;
    imrstx=fp_img_save_to_file(*img,"enrolledx.pgm");
    fp_img_free(*img);


fp_exit();
return 0;
}

Kode python

from ctypes import *
so_file = "/home/arkounts/Desktop/pythonsdk/capture.so"
my_functions = CDLL(so_file)

a=my_functions.main()
print(a)
print("Done")

Capture.so dibangun dan diakses dengan python. Tetapi menelepon dari python, saya mendapatkan kesalahan Segmentasi. Apa yang bisa menjadi masalah saya?

Terima kasih banyak

3
Aiden 10 Juli 2020, 17:38

1 menjawab

Jawaban Terbaik

Meskipun saya tidak terbiasa dengan libfprint, setelah melihat kode Anda dan membandingkannya dengan dokumentasi, saya melihat dua masalah dengan kode Anda yang keduanya dapat menyebabkan kesalahan segmentasi:


Masalah pertama:

Menurut dokumentasi fungsi fp_discover_devs, NULL dikembalikan karena kesalahan. Jika berhasil, daftar yang diakhiri NULL dikembalikan, yang mungkin kosong.

Dalam kode berikut, Anda memeriksa kegagalan/keberhasilan, tetapi jangan memeriksa daftar kosong:

devices=fp_discover_devs();
if(devices){
    device=fp_dev_open(*devices);

    fp_dscv_devs_free(devices);
}

Jika devices bukan NULL, tetapi kosong, maka devices[0] (yang setara dengan *devices) adalah NULL. Dalam hal ini, Anda meneruskan pointer NULL ini ke fp_dev_open. Hal ini dapat menyebabkan kesalahan segmentasi.

Saya tidak berpikir bahwa ini adalah alasan kesalahan segmentasi Anda, karena kesalahan dalam kode Anda ini hanya akan dipicu jika daftar kosong dikembalikan.


Masalah kedua:

Parameter terakhir fp_dev_img_capture harus berupa penunjuk ke variabel dialokasikan bertipe struct fp_img *. Ini memberi tahu fungsi alamat variabel yang harus ditulis. Namun, dengan kode

struct fp_img **img;
[...]
caps=fp_dev_img_capture(device,0,img);

Anda melewatkan fungsi tersebut sebagai penunjuk liar, karena img tidak menunjuk ke objek yang sah. Ini dapat menyebabkan kesalahan segmentasi segera setelah penunjuk liar direferensikan oleh fungsi atau menyebabkan beberapa jenis tidak terdefinisi perilaku, seperti menimpa variabel lain dalam program Anda.

Saya sarankan Anda menulis kode berikut sebagai gantinya:

struct fp_img *img;
[...]
caps=fp_dev_img_capture(device,0,&img);

Sekarang parameter ketiga menunjuk ke objek yang valid (ke variabel img).

Karena img sekarang menjadi penunjuk tunggal dan bukan penunjuk ganda, Anda harus meneruskan img alih-alih *img ke fungsi fp_img_save_to_file dan fp_img_free.

Masalah kedua ini mungkin menjadi alasan kesalahan segmentasi Anda. Tampaknya Anda hanya "beruntung" karena program Anda tidak segfault sebagai program mandiri.

4
Andreas Wenzel 13 Juli 2020, 11:33