Mve: makescene mogok saat mengimpor file PNG

Dibuat pada 5 Sep 2017  ·  30Komentar  ·  Sumber: simonfuhrmann/mve

Saya memiliki masalah dengan perintah makescene yang tidak dapat saya selesaikan sendiri.

Saya telah mengkloning dan membangun repositori sesuai dengan instruksi di Readme.md di bawah Ubuntu 16.04 64 bit. Build dikompilasi tanpa kesalahan dan semua aplikasi ada di sana.

Namun, jika saya menjalankan perintah makescene dengan parameter -i, itu hanya akan membuat folder adegan dan kemudian crash dengan pesan "Ungültiger Maschinenbefehl (Speicherabzug geschrieben)" (Saya menjalankan Ubuntu versi Jerman)

Saya telah menambahkan pesan keluaran ke kode untuk melihat seberapa jauh perintah dijalankan dan ternyata, kerusakan terjadi pada file image_io.cc, dalam fungsi load_png_file, di sekitar baris 311-314, tempat penunjuk diatur.

Saya tidak tahu bagaimana cara memperbaikinya. Nilai untuk headers.height dan headers.channels tampaknya masuk akal.

Semua 30 komentar

Kerusakan di image_io relatif tidak mungkin. Bisakah Anda mencoba menulis program pengujian dan memuat gambar secara manual?

#include "mve/image_io.h"
int main() {
  mve::image::load_png_file("your path");
  return 0;
}

Apakah ada hal lain yang istimewa dari gambar tersebut? Apakah itu PNG 8 atau 16 bit?

Oke, saya telah mengkompilasi program pengujian dan mencoba memuat PNG yang ada di folder yang sama dengan aplikasi pengujian. Saya mendapatkan hasil yang sama, program macet dengan "Ungültiger Maschinenbefehl (Speicherabzug geschrieben)".

Namun, jika saya mengubah panggilan fungsi menjadi "load_tiff_file" dan memuat file TIFF, tampaknya berjalan dengan baik. Mungkin fungsi load_png_file rusak secara khusus?

Tidak yakin apakah ini membantu, tetapi saya telah mengubah kode kembali ke load_png_file dan menggunakan strace untuk mendapatkan log sistem yang terkait dengan aplikasi ini. Ini adalah beberapa baris terakhir dari log itu sebelum macet:

14:00:46.197536 buka("./frame_0001.png", O_RDONLY) = 3
14:00:46.197561 fstat(3, {st_mode=S_IFREG|0664, st_size=407653, ...}) = 0
14:00:46.197582 baca(3, "\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\5\0\0\0\2\320\10\2\0 \0\0@\37J"..., 4096) = 4096
14:00:46.197651 mmap(NULL, 2768896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcadc163000
14:00:46.198666 --- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPN, si_addr=0x40b69d} ---
14:00:46.337334 +++ dibunuh oleh SIGILL (core dibuang) +++

Apakah Anda keberatan mengirimkan saya tautan ke gambar itu?

Dugaan saya adalah gambar hanya memiliki ekstensi png tetapi sebenarnya bukan png... Saya telah melihat masalah serupa di mana file ".png" sebenarnya dikodekan jpeg.

http://maxdid.it/gamejam/img/frame_0001.png

Saya menggunakan ffmpeg untuk mengekspor bingkai video ke file gambar.

Saya pikir itu mungkin format file yang salah juga, tetapi saya telah menggunakan perintah convert untuk mengonversinya dari png ke tiff dan kembali, tanpa efek.

File dimuat dengan baik di sini.

open("frame_0001.png", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0640, st_size=691915, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5395d8a000
read(3, "\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\5\0\0\0\2\320\10\2\0\0\0@\37J"..., 4096) = 4096
mmap(NULL, 2768896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5393b87000
read(3, "\7\0?)\363\207i\27\30x'\356\330\214Xg\7\260\334W\23G\371\323\31 \323\2S\273\353\\"..., 4096) = 4096
...

Menurut strace Anda, program Anda dimatikan oleh SIGILL (bukan KILL). Saya yakin ini berarti prosesor atau OS Anda mencoba menjalankan instruksi yang tidak valid. Saya tidak tahu harus bagaimana dengan ini, tetapi saya yakin itu adalah sistem Anda, atau perpustakaan libpng Anda yang entah bagaimana kacau. Bisakah Anda mencoba menginstal ulang/memperbarui libpng?

Jadi, saya telah menghapus instalan versi libpng yang saya instal melalui apt-get install dan sebagai gantinya mengunduh repositori libpng secara langsung, mengompilasinya dan menginstalnya.

Sayangnya, itu memiliki efek yang sama. Mungkin itu benar-benar prosesor saya? Saat ini saya menggunakan prosesor AMD Phenom II X4 965, yang saya kira bukan model terbaru. Namun, saya tidak berpikir saya pernah memiliki masalah serupa sebelumnya.

Bagaimanapun, karena kalian tidak dapat mereproduksi masalah, saya kira saya akan menutup masalah.

Saya menyesal mendengarnya masih tidak berfungsi. Saya tidak benar-benar berpikir itu perangkat keras Anda ... tapi saya kehabisan ide. Mungkin ada flag waktu kompilasi untuk menonaktifkan fitur akselerasi tertentu untuk libpng? Pada titik ini saya hanya menebak tanpa benar-benar tahu apa yang menyebabkan masalah ini.

Saya tahu mengapa makescene mogok saat mengimpor file gambar setelah banyak percobaan. Bukan alasan libjpeg atau libpng, alasan sebenarnya adalah openMP. Anda dapat memperbaiki bug ini dengan kode-kode ini di makescene.cc:
845 Baris
mve::ImageBase::Ptr gambar;

pragma omp paralel untuk jadwal yang dipesan (dinamis,1)

for (std::size_t i = 0; i < dir.size(); ++i)

....
std::string exif;

pragma omp kritis

    image = load_any_image(afname, &exif);

...

Tapi perubahan itu sangat tidak masuk akal. Anda menyimpan gambar di variabel image yang dibagikan di semua utas, dan meskipun memuat gambar sekarang diserialisasi, Anda akan menimpa gambar karena kondisi balapan dan menggunakan data yang salah setelah memuat gambar. ..

Sudahkah Anda mencoba menempatkan #pragma omp kritis sebelum memuat gambar?

@timlgy , dapatkah Anda memberi tahu kami lebih banyak tentang sistem Anda? CPU, sistem operasi, dan kompiler mana yang Anda gunakan?

Ini berfungsi untuk saya di Ubuntu 14.04.5 LTS, 16U32G dan kompilernya adalah gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) PS 'data salah' apa itu? prebundle.sfm?

menurut artikel ini #pragma omp critical
Arahan kritis omp mengidentifikasi bagian kode yang harus dieksekusi oleh satu utas pada satu waktu.
Jadi saya pikir mungkin 'load_any_image' berbahaya ketika memasukkan kode ini ke dalam mve::ImageBase::Ptr imagel=oad_any_image(afname, &exif);

load_any_image hanya menggunakan libpng di latar belakang yang thread-safe bila digunakan dengan benar, yang saya harap kita lakukan. Dengan "data salah", maksud saya, dalam kode di atas, gambar dapat ditimpa dengan gambar lain sebelum digunakan dan dengan demikian Anda akan mendapatkan data gambar yang salah dalam tampilan Anda.

Sekarang hanya untuk merasakan masalah ini, siapa yang sebenarnya terpengaruh oleh crash ini?

Ketika saya memuat hanya satu gambar (jenis apa pun jpg tif atau png) tidak apa-apa, tetapi ketika saya memuat dua gambar (jenis apa pun) itu macet dengan probabilitas tinggi.

Saya tidak tahu apa yang menyebabkan masalah. Memuat gambar harus dimungkinkan secara paralel, dan saya belum pernah melihat masalah. Apakah crash ini mungkin terkait dengan memori yang tersedia, jika Anda memuat gambar yang sangat besar? Saya dapat membayangkan bahwa memuat 32 gambar (jika Anda memiliki banyak inti) secara paralel pada mesin RAM 2GB akan menyebabkan masalah.

Sementara itu, cukup letakkan baris #pragma omp critical sebelum load_any_image , yang akan menyelesaikan masalah.

@timlgy , dapatkah Anda memposting backtrace dari crash?
Juga, apa yang Anda maksud dengan "16U32G"?

@andre-schulz 16U32G berarti CPU 16 banyak utas dan 32GB Mem

Saya mengamati kerusakan yang sama pada Windows 7 64x dengan mve build terbaru dengan instruksi:

crash

Mencoba untuk ''menempatkan baris #pragma omp critical sebelum load_any_image", tetapi ini tidak membantu, dalam hal ini saya tidak dapat membangun. Bagaimana kita bisa menyelesaikannya? Apa tujuan menggunakan OpenMP di sini?

image

Mencoba mengimpor hanya satu gambar: Saya juga mendapatkan kerusakan yang sama.

Hai @stiv-yakovenko,
Terima kasih untuk informasi. Mungkinkah Anda memposting file png yang menyebabkan masalah?
Juga, CPU mana yang Anda gunakan?

cpuz

Masalahnya tampaknya makescene dikompilasi dalam mode Debug tetapi ditautkan ke libpng dalam mode Rilis; mungkin ada masalah dengan menautkan ke pustaka runtime yang berbeda (/ MD vs. / MDd). Ini adalah masalah dengan cara kerja sistem build saat ini. Saya harus menyelidiki ini lebih lanjut.
Bisakah Anda mengonfirmasi bahwa makescene berfungsi dalam mode RelWithDebInfo?

Jika Anda perlu menjalankan makescene dalam mode Debug, Anda dapat mengompilasi pustaka pihak ketiga dalam mode Debug dengan menambahkan Debug ke CMAKE_CONFIGURATION_TYPES di pihak ke-3 CMakeLists.txt . Kemudian, kompilasi ulang dan salin versi debug perpustakaan dengan tangan ke lokasi versi Debug makescene . Saya akan mencoba mencari tahu apakah saya dapat memperbaiki/mengotomatiskan ini.

Saya mengonfirmasi bahwa versi ReleaseWithDeb berfungsi.

@andre-schulz Hai, terima kasih atas analisis Anda tentang mode debug. Saya telah mengkompilasi ulang perpustakaan pihak ke-3 dalam mode Debug dan menambahkan tiffd.dll, zlibd.dll ke versi Debug dari makescene. Program masih macet di

png_read_image(png, &row_pointers[0]);

image

@andre-schulz Tidak apa-apa sekarang! Setelah kompilasi debug lengkap setelah memodifikasi CMAKE_CONFIGURATION_TYPES di CMakeLists.txt dari perpustakaan pihak ke-3 dan memodifikasi konfigurasi lib input MVE.sln, masalah pemuatan jpg diselesaikan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

HelliceSaouli picture HelliceSaouli  ·  14Komentar

Jus80687 picture Jus80687  ·  11Komentar

daleydeng picture daleydeng  ·  8Komentar

GustavoCamargoRL picture GustavoCamargoRL  ·  13Komentar

HelliceSaouli picture HelliceSaouli  ·  12Komentar