2016-09-15 4 views
0

Mit Visual Studio 2013, ich bin, was scheint sehr bizarr Verhalten mit dem Debugger, versuchen, durch einige Code, der Aufruf in libpng. Hier ist ein Code:Strange VS2013 Debugger-Verhalten mit Libpng 1.6.25

#include <iostream> 
#include <sstream> 
#include <conio.h> 
#include <list> 
#include "png.h" 

int keypause(const char * message = 0) { 
    if(message) 
     std::cout << message << std::endl; 
    return _getch(); 
} 

struct chunk_t { 
    png_bytep chunk_ptr; 
    png_size_t length; 
}; 
std::list<chunk_t> chunks; 
std::stringstream flush_target; 

void my_png_error_fn(png_structp png_ptr, png_const_charp message) { 
    std::cout << "Well crap. " << message << std::endl; 
} 

void my_png_write_fn(png_structrp png_ptr, png_bytep data, png_size_t length) { 
    png_bytep chunk = new png_byte[length]; 
    memcpy(chunk, data, length); 
    chunks.push_back({ chunk, length }); 
} 

void my_png_read_fn(png_structrp png_ptr, png_bytep data, png_size_t length) { 
} 

void my_png_flush_fn(png_structp png_ptr) { 
    for(auto chunk : chunks) { 
     flush_target.write((const char *)chunk.chunk_ptr, chunk.length); 
     delete[] chunk.chunk_ptr; 
    } 
    chunks.clear(); 
} 

// ... 

int main(void) { 
    // ... 

    png_structp png_ws_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, my_png_error_fn, my_png_error_fn); 
    if(png_ws_ptr == nullptr) { 
     keypause("png_ws_ptr is null"); 
     return 0; 
    } 

    png_infop info_ptr = png_create_info_struct(png_ws_ptr); 
    if(info_ptr == 0) { 
     keypause("info_ptr is null"); 
     png_destroy_write_struct(&png_ws_ptr, (png_infopp)NULL); 
     return 0; 
    } 
    if(setjmp(png_jmpbuf(png_ws_ptr))) { 
     keypause("setjmp failed"); 
     png_destroy_write_struct(&png_ws_ptr, &info_ptr); 
     return 0; 
    } 
    // ... 
    png_set_write_fn(png_ws_ptr, NULL, my_png_write_fn, my_png_flush_fn); 
    // ... 
    png_write_png(png_ws_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); 

    keypause("All done!"); 
    return 0; 
} 

Das Problem tritt auf, wenn ich versuche, einen Haltepunkt zu setzen überall über den Aufruf von png_create_write_struct. Die IDE behauptet, dass der Haltepunkt keinem kompilierten Code im Ziel entspricht. Wenn ich vor dem Aufruf an png_create_write_struct einen Haltepunkt setze, kann ich diese Funktion (ich verlinke mit einem Debug-Build von libpng), den ganzen Weg und wieder zurück gehen, und dann geht der Debugger verloren. Es endet, wenn man denkt, dass es sich innerhalb des Blocks if(png_ws_ptr == nullptr) { befindet, und wenn ich weiterhin auf "Step Over" klicke, läuft die aktuelle Ausführungslinie innerhalb dieses Blocks um und um.

Was tatsächlich passiert ist, dass das Programm bis zum Ende der main läuft und ich sehe die Nachricht in dem letzten Aufruf von keypause, wartet auf einen Tastendruck, und Ausfahrten, aber ohne tatsächlich jedes Schreiben von PNG-Daten zu tun. Ich habe Haltepunkte in all meinen Rückrufen gesetzt und keiner von ihnen wird getroffen.

Hat sonst noch jemand solche seltsamen Ereignisse erlebt? Irgendwelche Vorschläge, wie Sie den Debugger zum Verhalten bringen?

Danke!

+1

Debuggen Sie Ihr Projekt als Release Build oder als Debug Build? Ich hatte Breakpoints, die seltsames Verhalten auf Release Builds –

+0

@FirstStep - Definitiv ein Debug-Build hatte. Ich habe das schon oft genug gemacht, um nachzusehen. ;-) –

+0

Cool dann :) Nur checking you know –

Antwort

2

Wow. Es stellte sich heraus, dass die Quelldatei mit nicht übereinstimmenden Zeilenenden-Markern (CRLFs) beschädigt war. Ich habe dies erst entdeckt, als ich die Lösung geschlossen und wieder geöffnet habe, und ich wurde aufgefordert, die Zeilenenden zu vereinheitlichen. Ein Neuaufbauversuch ergab dann eine Handvoll Syntaxfehler (was mir sagt, dass der Compiler nicht kompilierte, was ich dachte), was, wenn er behoben wurde, eine ordnungsgemäß ausführbare ausführbare Datei ergab.

Es sind die kleinen Dinge, die Sie wirklich begeistern können!