gpt4 book ai didi

c++ - 编译发布时使用什么工具来查找 C++ 错误。 boost::asio,cmake。 vs2012.十字路口/0mq

转载 作者:行者123 更新时间:2023-11-30 04:24:22 27 4
gpt4 key购买 nike

我有某种内存或 winsock 问题,只有在 Release模式下编译 c++ 代码时才会发生。

内存问题的证据:

通过注释掉两行代码,修复了之前未知的错误。这两行代码看似无害。它们是旧版本遗留下来的。这表明我在某处使用未初始化的内存。 XS_Client 用作基类。

        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()
{
}


};

证据表明它是一个 windows/socket 问题:

真正的错误是我的 tcp 套接字 (localhost) 从不获取数据。但是,这仅在我在同一进程中同时使用 boost::asio 和 crossroads/0mq 时才会发生。此外,如果我通过调试器启动进程,则不会出现该错误。

所以当我在“realesewithdebuginfo”模式下编译时,错误只会在不在调试器中时出现。完全相同的编译代码。

问题1:c++代码分析和/或windows api调用分析推荐什么工具?此外,该问题不容易重现,因此最好进行静态分析。我使用了很多模板、boost::asio::udp、多个踩踏库。多个套接字/io 库。

问题 2:在 Windows 端有什么可用的东西来查看我是否由于外部库的套接字 i/o 误用而导致死锁?

tyvm4yh

最佳答案

在调试器下运行与不在调试器下运行的主要区别在于调试堆。要关闭调试堆,您可以使用 _NO_DEBUG_HEAP 环境变量。您可以全局设置它,但最好只为调试运行而设置,如以下答案所示:

https://stackoverflow.com/a/1060929/1618406

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

几乎每一次,关闭调试堆并禁用优化都让我在调试器中重现了这种错误,然后毫不费力地调试它。

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

http://www.virtualdub.org/blog/pivot/entry.php?id=319

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

http://www.howtogeek.com/howto/4161/disable-program-compatibility-assistant-in-windows-7-and-vista/

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

关于c++ - 编译发布时使用什么工具来查找 C++ 错误。 boost::asio,cmake。 vs2012.十字路口/0mq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com