使用什么工具来查找c++;编译发布时出现错误。阿西奥,卡马克。vs2012。十字路口/0mq 我有一些内存或Winsock问题,只有在发布模式编译C++代码时才发生。

使用什么工具来查找c++;编译发布时出现错误。阿西奥,卡马克。vs2012。十字路口/0mq 我有一些内存或Winsock问题,只有在发布模式编译C++代码时才发生。,c++,visual-studio,sockets,boost,winsock,C++,Visual Studio,Sockets,Boost,Winsock,证明这是内存问题的证据: 通过注释掉两行代码,修复了以前未知的bug。这两行代码似乎无害。它们是旧版本遗留下来的。这表示我正在使用未初始化的内存。XS_客户端用作基类 class XS_Client { private: /* these two lines of comments fixed the bug */ /*****************************************

证明这是内存问题的证据:

通过注释掉两行代码,修复了以前未知的bug。这两行代码似乎无害。它们是旧版本遗留下来的。这表示我正在使用未初始化的内存。XS_客户端用作基类

        class XS_Client
        {
        private:

            /* these two lines of comments fixed the bug */
            /***********************************************
            enum { max_length = 1024 };
            char data_[max_length];
            **********************************************/

            void * context_;
            void * socket_;
            boost::thread t_;
            volatile bool should_run_;              
        public:
            XS_Client(void *context, short type, const std::string &address)
            : context_(context), socket_(XS_Socket::NewSocket(context_,type))
            {
                XS_Socket::Connect(socket_,address);
        #ifdef _OUTPUTD
                std::cout << address << " XS_Client: " << GetCurrentThreadId() << std::endl;
        #endif
                boost::thread   t(boost::bind(&XS_Client::thread_func, this));
                t_.swap(t);
            }

            void SetSockOpt(int option, const void *optval,size_t optvallen)
            {
                int rc = xs_setsockopt(socket_,option,optval,optvallen);
                if ( rc != 0 )
                    std::cout << "xs_setsockopt error: " << xs_strerror(errno) << std::endl;
            }

            virtual ~XS_Client()
            {
                if ( should_run_ )
                    Stop();
            }

            void thread_func() {
                /* Create an empty message */
                xs_msg_t msg;

                while (should_run_)
                {
                    //int bytes_recvd = xs_recv(socket_,data_,max_length,0);
                    int rc = xs_msg_init (&msg);
                    if ( rc != 0 )
                        std::cout << "xs_msg_init error: " << xs_strerror(errno) << std::endl;
                    assert (rc == 0);
                    /* Block until a message is available to be received from socket */
                    int bytes_recvd = xs_recvmsg (socket_, &msg, 0);

        #ifdef _DEBUG 
                    std::cout << "received " << bytes_recvd << std::endl;
        #endif;

                    if ( bytes_recvd == -1 )
                    {

                        if ( xs_errno() == ETERM ) 
                        {
                            should_run_ = false;
                            std::cout << "ETERM received" << xs_strerror(errno) << std::endl;
                            break;
                        }

                        if ( !should_run_ )
                            xs_msg_close (&msg);
                        else
                        {
                            std::cout << "receive error!" << xs_strerror(errno) << std::endl;
                            boost::this_thread::sleep(boost::posix_time::milliseconds(100u));
                        }
                    }
                    else 
                    {

        #ifdef _DEBUG 
                        //std::cout << "received " << xs_msg_data(&msg) << std::endl;
        #endif;
                        OnMsg(xs_msg_data(&msg),bytes_recvd);

                        /* Release message */
                        xs_msg_close (&msg);
                    }

                }

                int rc = xs_close (socket_);        
                if ( rc != 0 )
                    std::cout << "xs_close error: " << xs_strerror(errno) << std::endl;

                Cleanup();
            }

            virtual void OnMsg(const void *msg, int bytes_recvd)
            {
                std::cout << "virtual void OnMsg received " << bytes_recvd << std::endl;
            }

            virtual void Stop()
            {
                should_run_ = false;
                t_.timed_join(boost::posix_time::milliseconds(2000));
            }

            virtual void Cleanup()
            {
            }


        };
classxs_客户端
{
私人:
/*这两行注释修复了错误*/
/***********************************************
枚举{max_length=1024};
字符数据[最大长度];
**********************************************/
void*context;
空*插座;
boost::线程t;
应运行易失性bool;
公众:
XS_客户端(void*上下文、短类型、常量std::字符串和地址)
:context_(context),socket_(XS_socket::NewSocket(context_,type))
{
XS_套接字::连接(套接字,地址);
#ifdef_输出

std::cout在调试器下运行与不在调试器下运行的主要区别在于调试堆。要关闭调试堆,可以使用
\u NO\u debug\u heap
环境变量。您可以全局设置此变量,但最好只为调试运行而这样做,如下所示:

如果这复制了错误,但您实际调试时遇到困难(因为优化的代码),我会暂时禁用您的发布版本的优化。只是别忘了再次打开它们

几乎每次,关闭调试堆并禁用优化都会让我在调试器中重现这种错误,然后调试它,而不会有太多麻烦

此外,如果您使用Windows 7,您可能会发现程序兼容性助手正在介入并执行一些使您的程序正常工作的操作,即使它不应该:

您可以在程序的清单中禁用它,但我更喜欢使用组策略编辑器禁用它,例如:


如果您曾经在调试器之外运行程序,强烈建议禁用程序兼容性助手…

尝试32位和64位版本,移植到Linux可以让您访问更好的工具,如Valgrind.Linux端口。因此,cmake……但目前在单台服务器上与.net通信,没有虚拟机。