Ubuntu 10.04 32位,eclipse,C和C ++
我有一个程序,它使用select()来监视一堆TCP和UDP端口。我使用 sockaddr_in 结构以通常的方式创建这些端口(socket(),bind(),listen(),accept()等。)
该程序在命令行正常工作。当我注意到以下警告时,我正在使用eclipse调试器修复一个错误(现在修复!):
warning: can't find linker symbol for virtual table for `sockaddr_in' value
warning: found `operator delete(void*)' instead
好吧,在修复我的错误后,我检查了警告并且警告仍然存在。
我知道一旦我进入配置端口/套接字连接的ConfigureServer()例程,警告就会开始。 sockaddr_in结构在例程中声明并且在堆栈中。事实上,程序中还没有任何内容。这是C和C ++的混合,到目前为止还没有声明或使用过对象。
这是常规的开始。其他端口还有几个相同的位。
int configureServer()
{
sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons( g_tcpPorts[0].serverPort );
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Create and initialize the TCP socket */
if (( g_tcpPorts[0].serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0 )
{
PLOG( ERROR ) << "failed to acquire a socket for IO Control Server port: " << g_tcpPorts[0].serverPort;
return -1; // caller will CloseAllPorts();
}
// ...........
}
所以,我的问题是,如何调试和追踪这些警告的原因。
谢谢,
答案 0 :(得分:3)
GDB仍然不太完美,特别是在调试C ++代码时。
在这种情况下,sockaddr_in
是“普通旧数据”(没有任何C ++特性的C结构)。它不需要也不应该有任何虚拟表。如果GDB不这么认为,这就是GDB的问题。
There are two bugs open in GDB bug database that quite this exact message(针对不同的结构/类)。除非它妨碍你的调试,否则我不会太担心它。
答案 1 :(得分:0)
在包含声明sockadd_in结构的头文件之前,尝试使用extern“C”。
extern "C"
{
# include <netinet/in.h>
}
这可能会确保sockaddr_in不会或不需要vtab。