つれづれ日記 2010年4月

予定

毎日


2010年4月30日 (金曜日)

00:20:26 # Life C++のコンパイルエラー。 undefined reference to vtable for ... というメッセージはあるいみ意味不明さで有名なエラーらしい。 親クラスの中の最初のvirtual functionの実体をどこにも定義していない場合に出るエラーだそうな。 virtual hoge();virtual hoge() {} に直したらエラーが消えた。

httpserver.cc:(.text._ZN10threadpool10UrlHandlerD2Ev[threadpool::UrlHandler::~UrlHandler()]+0xd): undefined reference to `vtable for threadpool::UrlHandler'
/tmp/ccRiUGHt.o:(.rodata._ZTI16SimpleUrlHandler[typeinfo for SimpleUrlHandler]+0x8): undefined reference to `typeinfo for threadpool::UrlHandler'
collect2: ld returned 1 exit status
	

22:50:21 # Life C++での文字列比較。 String型の文字列と、const char* の比較(string("hogehoge")と "hogehoge")ってどうなっているのだろうと おもってgccの出力を眺めてみた。 みてみると当たり前の結果に。 basic_stringというclassがあって、それがoperator== を実装していて、 operator==(const char*, string) と operator==(string, const char*) とを定義している(stringとconst char*そのものではないけど)、ということだった。 このケースでは、 コンパイラが文字列だからと何か賢くコンテキストを判断しているというよりはC++の定義どおりにコンパイラが動いているという印象。 しかしこの間数名(_ZNKSs7compareEPKc)が暗号っぽいのはなんとかならないものか。 これはまだいいとしても、basic_stringのコンストラクタっぽいタイミングで呼ばれている _ZNSsC1EPKcRKSaIcEはなにだかさっぱりわからない。 demangle すればよいんだろうか。

.LBB210:
	.file 3 "/usr/include/c++/4.3/bits/basic_string.h"
	.loc 3 2189 0
	movl	$.LC0, 4(%esp)
	movl	%ebx, (%esp)
.LEHB1:
	call	_ZNKSs7compareEPKc
.LBE210:
	.loc 1 13 0
	testl	%eax, %eax
	jne	.L6
	

23:00:00 # Life C++ で string を初期化するのに null を渡したら exception が発生する。 しかしメッセージがけっこう遠回りだ。 初めてみたときにどの行の何が原因なのかを探すのに結構時間がかかりそうな気がする。

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted
	

2010年4月15日 (木曜日)

12:46:13 # Life straceでネットワーク通信するアプリケーションを解析。 strace -p PID でプロセスにアタッチすると実行中の プロセスのシステムコールを見ることができます。 ネットワークに書き込んだり読み込んだりするところはシステムコールとしては通常 write / read で、straceの出力では通信内容が引数の文字列として見えます。 ただ、デフォルトでは文字列パラメータは先登の32バイトしか表示してくれないので、 -s で適切な文字列サイズを指定しましょう。とりあえず1024バイトくらいを指定すればよいんじゃないでしょうか。 パケットダンプしなくてもネットワーク通信内容はデバッグできるよ、というメモでした。

表示例:

read(4, "GET / HTTP/1.0\r\nUser-Agent: w3m/0.5.2\r\nAccept: text/html, text/*;q=0.5, image/*, application/*, video/*, audio/*\r\nAccept-Encoding: gzip, compress, bzip, bzip2, deflate\r\nAccept-Language: ja;q=1.0, en;q=0.5\r\
nHost: localhost:8088\r\nPragma: no-cache\r\nCache-control: no-cache\r\n\r\n"..., 2048) = 273
	

2010年4月13日 (火曜日)

14:54:49 # Life そういえば最近日記を書いていない。 しかしいざとなって書くことも特にない。


Junichi Uekawa

$Id: 201004.html.ja,v 1.6 2010/04/30 14:01:46 dancer Exp $