ませbreak
がちょうどプロンプト
abort()
にbt
を入力し、必要ありませんが、信号が発生することが原因となり、GDBはデフォルトですでに信号に分割します。
例えば:そして
#include <assert.h>
void g(int i) {
assert(0);
}
void f(int i) {
g(i);
}
int main(void) {
f(1);
}
:
gcc -std=c99 -O0 -ggdb3 -o a a.c
gdb -ex run ./a
それからちょうど入力bt
シェル中:
既に関数値を示す
(gdb) bt
#0 __GI_raise ([email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:58
#1 0x00007ffff7a483ea in __GI_abort() at abort.c:89
#2 0x00007ffff7a3ebb7 in __assert_fail_base (fmt=<optimized out>, [email protected]=0x555555554788 "0", [email protected]=0x555555554784 "a.c", [email protected]=4,
[email protected]=0x55555555478a <__PRETTY_FUNCTION__.1772> "g") at assert.c:92
#3 0x00007ffff7a3ec62 in __GI___assert_fail (assertion=0x555555554788 "0", file=0x555555554784 "a.c", line=4, function=0x55555555478a <__PRETTY_FUNCTION__.1772> "g")
at assert.c:101
#4 0x00005555555546ca in g (i=1) at a.c:4
#5 0x00005555555546df in f (i=1) at a.c:8
#6 0x00005555555546f0 in main() at a.c:12
(f (i=1)
)。
そして、あなたはまた、いつものように行うことができます:Ubuntuの16.10、GDB 7.11でテスト
(gdb) f 4
#4 0x00005555555546ca in g (i=1) at a.c:4
4 assert(0);
(gdb) p i
$1 = 1
を。
Visual StudioのWindowsでは、破損は、失敗した 'assert'のデフォルト動作です。私は* nix世界ではそうではないことに驚いています - 失敗した 'assert'は通常そこで何をしますか? – Angew
gdbでは、プログラムが実行される前に、関数abort()でブレークポイントを追加するために 'break abort'(または単に' b abort')を使うことができます。これは、アサーションが失敗したときにバックトレースを作ることを可能にします(あるときは 'abort()'を呼び出すと仮定します;代わりに 'exit()'を呼び出す実装もあります)。しかし、実行を継続することについてはわからない。 – notmyfriend
通常これはassert()がabortを呼び出すときにデフォルトで動作し、abortはSIGABRTシグナルを発生させます。gdbはデフォルトでそのシグナルを破り、スタックを検査したり、スタックを上/下に移動したりすることができます。 assert()を含む関数に渡し、変数を検査します。 – nos