Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Debug assertion failed! _pFirstBlock == pHead

Ostatnio zmodyfikowano 2016-04-27 08:30
Autor Wiadomość
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:
C/C++
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 };
    // The host pointers point to the start of the image data:
    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
P-147609
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ć:
C/C++
input_buf.elem_size = output_buf.elem_size = 4;

output_buf.host = new uint8_t[ width * height * output_buf.elem_size ];
?
  
  
P-147615
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.
P-147668
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?
P-147677
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
P-147717
« 1 »
  Strona 1 z 1