1

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

// ...........
}

したがって、私の質問は、これらの警告の原因をデバッグして追跡するにはどうすればよいかということです。

ありがとう、

4

2 に答える 2

3

GDBは、特にC ++コードのデバッグに関しては、まだ完全ではありません。

この場合、sockaddr_inは「プレーンな古いデータ」(C ++機能のないC構造体)です。仮想テーブルは必要ありませんし、持ってはいけません。GDBが別のことを考えている場合、それはGDBの問題です。

GDBバグデータベースには2つのバグがあり、これはまさにこのメッセージです(構造体/クラスが異なる場合)。デバッグの邪魔にならない限り、あまり心配する必要はありません。

于 2012-04-19T13:24:29.387 に答える
0

sockadd_in構造体を宣言するヘッダーを含める前に、extern"C"を使用してみてください。

extern "C"
{
#  include <netinet/in.h>
}

それはおそらくsockaddr_inがvtabを持っていないか必要としないことを保証するでしょう。

于 2012-04-19T13:03:09.570 に答える