Macでgdbに「no core file handler recognizes format」と言われる場合の対処

2015-02-26
lldb
llvm

printfを使ったデバッグから卒業したくて、gdbを使ったデバッグを練習していたのですが 肝心の自作ツールのデバッグをgdbでやろうとすると・・・

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GNU gdb (GDB) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin13.4.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from bin/mssql...done.
"/cores/core.48570": no core file handler recognizes format

こんな感じで、formatが読めないぜというエラーが出る。 色々調べた結果、原因はMacのgccがLLVM/Clangなので、coreファイルのフォーマットが違うということらしいです。

厄介なのは、簡単なサンプルプログラムとかはgdbでも解析できたってことですね。 どうせなら、全部失敗すりゃいいのにw でもって、解決策ですが2つあります。

Macにgdbをインストールする

homebrewでインストールできるようです。 僕は試してないですが、gdbをどうしても使いたい場合は、こちらが良いかと。

lldbを使う

私はこの方法でデバッグしました。 lldbは、llvm/clangのデバッグツールです。

同じかなと思うと、ちょっとデバッグ時のコマンドが異なるようです。
チートシートがあるので、それを見て使うと良いでしょう。

GDB TO LLDB COMMAND MAP - The LLDB Debugger

こんな感じで、segvが起こった場所を特定できました。

1
2
3
4
5
6
7
8
9
10
(lldb) up
frame #8: 0x0000000103322e65 mssql`add_node(value=0x00007fff5c8e04af, tail=0x00007fed525057f0) + 53 at db.c:144
141
142 node * add_node(char * value, struct result_node * tail){
143 struct result_node * node = (struct result_node *)malloc( sizeof(struct result_node) );
-&gt; 144 node-&gt;value = (char *)malloc(256);
145 strcpy(node-&gt;value, value);
146 node-&gt;next = NULL;
147 if(tail != NULL){
(lldb)

今後もlldbを使っていくべきか、gdbにするべきか若干悩みますが、少なくともprintfデバッガーからは卒業できました。