Szadziu Temat założony przez niniejszego użytkownika |
Debug assertion failed! _pFirstBlock == pHead » 2016-04-24 16:17:32 Witam. Pisząc mój program do przetwarzania obrazów HDR, natrafiłem na problem przy korzystaniu z funkcji biblioteki Halide. Podejrzewam, że wynika on z przekombinowanej struktury programu. Mianowicie, cała aplikacja napisana jest w C#. Postanowiłem jednak przetestować i dodać support do tej biblioteki. Jako iż nie ma ona żadnych wraperów itp do C# postanowiłem stworzyć osobną dll C++ do której przekaże potrzebne dane. Dll'ka ta wczytuje biblioteke hallide i ją wykorzystuje. Przykładowa funkcja: int halideOperations( uint8_tdata[], int size, int width, int height ) { uint8_t output = new uint8_t[ width * height ]; buffer_t input_buf = { 0 }, output_buf = { 0 }; input_buf.host = data; output_buf.host = output; input_buf.stride[ 0 ] = output_buf.stride[ 0 ] = 4; input_buf.stride[ 1 ] = output_buf.stride[ 1 ] = width; input_buf.extent[ 0 ] = output_buf.extent[ 0 ] = height; input_buf.extent[ 1 ] = output_buf.extent[ 1 ] = 4; input_buf.elem_size = output_buf.elem_size = 4; Halide::Image < float > img( & input_buf, "hdr_img" ); Halide::Var x, y, c; Halide::Func bright; bright( x, y, c ) = pow( img( x, y, c ), 2.f ); Halide::Image < float > out = bright.realize(); auto & buff = out.raw_buffer()->host; for( unsigned int i = 0; i < size; i++ ) { data[ i ] = buff[ i ]; } return 1; }
Przy próbie odpalenia gdy tylko dochodzi do linijki bright(x, y, c) = pow(img(x, y, c), 2.f); otrzymuje komunikat z tematu. Ktoś może coś doradzic żeby naprawić ten błąd? link do błędu: http://imgur.com/1kuGfrd |
|
j23 |
» 2016-04-24 18:53:23 Tę asercję dostajesz wtedy, gdy kod zaczyna pisać po pamięci sterty poza dozwolonym obszarem. Prawdopodobnie za mało przydzieliłeś pamięci. Nie znam tej biblioteki, ale czy nie tak powinno być: input_buf.elem_size = output_buf.elem_size = 4;
output_buf.host = new uint8_t[ width * height * output_buf.elem_size ]; ? |
|
Szadziu Temat założony przez niniejszego użytkownika |
» 2016-04-25 22:15:20 Dzięki za odpowiedź. Rozumiem mniej więcej o co chodzi, chociaż sam output_buf nawet jeśli zaalokowany na zbyt małą wartość, to w podanym przeze mnie przykładzie nie jest wykorzystany, wiec wątpię, żeby był przyczyną tego błędu. Jakieś inne propozycje? Czytałem, że problem ten występuje przy tym jak pamięć jest zwalniana przez aplikację automatycznie zarządzająca pamięcią (managed), i jednocześnie allokowana zwyczajnie (native). Podobno powinno pomóc ustawienie flagi /Ddm czy jakos tak. Jednak od początku mam tą flage i nic to nie pomaga. |
|
j23 |
» 2016-04-26 11:05:40 Faktycznie, output_buf jest nieużywany. W takim razie po co on tam jest? Teraz masz wyciek pamięci. Co do samego wyliczania ilości pamięci, powinieneś wziąć to pod uwagę, bo ten błąd możesz mieć w innych miejscach kodu.
Ta asercja może także pojawić się jeśli kod z DLL-ki będzie zwalniał pamięć przydzieloną w aplikacji lub innej DLL-ce (i na odwrót). Zadbaj o to, żeby DLL-ka i aplikacja używały takiego samego typu biblioteki CRT - Multi-threaded DLL.
Jak wygląda callstack? |
|
Szadziu Temat założony przez niniejszego użytkownika |
» 2016-04-27 08:30:36 Znalazłem. Problemem był Visual Studio 2015, a konkretnie kompilator. Po zmianie toolsetu na 2013 wszystko zadziałało. Dzięki za pomoc |
|
« 1 » |