1
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/to/drcalc...(no debugging symbols found)...done.
(gdb) r
Starting program: /path/to/cdrcalc 

Program received signal SIGSEGV, Segmentation fault.
0xb7e606b6 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) 

誰でも助けることができますか?私のコードはhttps://github.com/dramforever/drcalc/ branchからダウンロードできますreadline

4

2 に答える 2

2

-gフラグを指定してコンパイルする必要があるため、gdb はより多くのデバッグ情報を表示できます。これを行うと、 NULL であるsh_lineを使用しようとすると、関数inp_readlineでプログラムがクラッシュすることがわかります。

その理由は、sh_line 0 (NULL ポインターとして解釈される) を初期値として指定し、inp_readline でsh_lineNULL でないかどうかをチェックし、その場合は古い文字列を解放して新しい文字列を読み取るためです。readlineで。しかし、それが開始時の NULL の場合、何も行われないため、strlen(sh_line)に到達しても NULL のままで、strlenがクラッシュします。

編集:

原文ではこう言っている

if (sh_line) free(sh_line);sh_line=0; 
sh_line = readline(sh_Prompt);

しかし、いくつかの中括弧を追加したので、代わりに

if (sh_line) {free(sh_line);sh_line=0;
sh_line = readline(sh_Prompt);}

そのため、readlineが呼び出されることはありません。

于 2013-01-29T09:40:43.803 に答える
0

(質問者です!)
readline については何も知りません。したがって、適切な関数定義が機能します。https://github.com/jterrace/craq/blob/master/gmp-4.3.1/demos/calc/calcread.c
を選択しました

于 2013-01-29T11:07:19.083 に答える