faith's blog

気まぐれ日記

crosswalk が gdb で追えない

先ほど書いた記事のエラーログですが、

[0626/133627:ERROR:command_buffer_proxy_impl.cc(151)] Could not send GpuCommandBufferMsg_Initialize.

該当箇所は、こんなのです。

   bool result;
   if (!Send(new GpuCommandBufferMsg_Initialize(
       route_id_, handle, &result, &capabilities_))) {
     LOG(ERROR) << "Could not send GpuCommandBufferMsg_Initialize.";
     return false;
   }

GpuCommandBufferMsg_Initialize なんですが、 gtags で引っかからないし、grepしても class 定義がない。 しかも、gdb で step 実行すると、すり抜けるという謎現象。 最適化が問題かと思ったんですが、 この class がマクロで定義されているようなんですね。

IPC_SYNC_MESSAGE_ROUTED1_2(GpuCommandBufferMsg_Initialize,
                           base::SharedMemoryHandle /* shared_state */,
                           bool /* result */,
                           gpu::Capabilities /* capabilities */)

↑これを性的に静的に追っていくと、↓に行き着きます。

#define IPC_SYNC_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list)   \
  class IPC_MESSAGE_EXPORT msg_class : public IPC::SyncMessage {              \
   public:                                                                    \
    typedef IPC::SyncMessageSchema Schema;  \
    typedef Schema::ReplyParam ReplyParam;                                    \
    typedef Schema::SendParam SendParam;                                      \
    enum { ID = IPC_MESSAGE_ID() };                                           \
    msg_class(int32 routing_id                                                \
              IPC_COMMA_OR_##in_cnt(IPC_COMMA_##out_cnt)                      \
              IPC_TYPE_IN_##in_cnt in_list                                    \
              IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt)                     \
              IPC_TYPE_OUT_##out_cnt out_list);                               \
    virtual ~msg_class();                                                     \
    static bool ReadSendParam(const Message* msg, Schema::SendParam* p);      \
    static bool ReadReplyParam(                                               \
        const Message* msg,                                                   \
        TupleTypes::ValueTuple* p);                               \
    static void Log(std::string* name, const Message* msg, std::string* l);   \
    IPC_SYNC_MESSAGE_METHODS_##out_cnt                                        \
  };

コード上は、そんな class が存在しないので、gtags でも追えないし、gdb でもひっかからないと。 どうしたらいいんでしょうかね・・・。 ていうか、なんでこんなことするかなー。 デバッガで追えないような実装するとか、何考えてんだろ、馬鹿なの?死ぬの?