2016-09-15 45 views
0

使用Visual Studio 2013,我遇到了什么似乎非常奇怪的行为与调试器,试图通过调用一些代码调用libpng。下面是一些代码:奇怪的VS2013调试器行为与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; 
} 

的问题显示出来,当我尝试设置一个断点之外的地方调用png_create_write_struct。 IDE声称该断点与目标中的任何编译代码不对应。如果我在调用png_create_write_struct之前设置了一个断点,我可以进入该函数(我正在链接一个libpng的调试版本),一路通过它,然后退出,然后调试器就会丢失。它认为它在if(png_ws_ptr == nullptr) {区块内,如果我继续单击“Step Over”,当前执行线循环在该区块内部和周围。

实际情况是程序运行到main的末尾,我看到最后一次调用keypause时的消息,等待按键,然后退出,但实际上没有写入任何PNG数据。我在所有回调中设置了断点,并且没有一个被触发。

有没有其他人遇到过这样奇怪的事情?有关如何让调试器行为的任何建议?

谢谢!

+1

您是以发布版本还是调试版本的形式调试项目?我的断点在发布版本上有怪异的行为 –

+0

@FirstStep - 绝对是一个Debug版本。我已经做了相同的事情足够的时间来检查。 ;-) –

+0

酷然后:)只是检查你知道 –

回答

2

哇。发现源文件已损坏,并有不匹配的行结束标记(CRLF)。在我关闭并重新打开解决方案之前,我没有发现这一点,并且我被提示统一线路结束。重建尝试然后暴露了一些语法错误(它告诉我编译器没有编译我认为是的),修复后得到可正确调试的可执行文件。

这是真正可以得到你的小东西!