📄 callfuncs.exp
字号:
gdb_test "p sum_args(4,{2,3,4,5})" " = 14" gdb_test "p sum10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" " = 55" gdb_test "p cmp10 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)" " = 1" gdb_test "p t_structs_c(struct_val1)" "= 120 'x'" \ "call inferior func with struct - returns char" gdb_test "p t_structs_s(struct_val1)" "= 87" \ "call inferior func with struct - returns short" gdb_test "p t_structs_i(struct_val1)" "= 76" \ "call inferior func with struct - returns int" gdb_test "p t_structs_l(struct_val1)" "= 51" \ "call inferior func with struct - returns long" gdb_test "p t_structs_f(struct_val1)" "= 2.12.*" \ "call inferior func with struct - returns float" gdb_test "p t_structs_d(struct_val1)" "= 9.87.*" \ "call inferior func with struct - returns double" gdb_test "p t_structs_a(struct_val1)" "= (.unsigned char .. )?\"foo\"" \ "call inferior func with struct - returns char *"}# Procedure to get current content of all registers.global all_registers_contentset all_registers_content ""proc do_get_all_registers { } { global gdb_prompt global expect_out global all_registers_content set all_registers_content "" send_gdb "info all-registers\n" gdb_expect { -re "info all-registers\r\n(.*)$gdb_prompt $" { set all_registers_content $expect_out(1,string) } default {} }}# Start with a fresh gdb.gdb_exitgdb_startgdb_reinitialize_dir $srcdir/$subdirgdb_load ${binfile}gdb_test "set print sevenbit-strings" ""gdb_test "set print address off" ""gdb_test "set width 0" ""if { $hp_aCC_compiler } { # Do not set language explicitly to 'C'. This will cause aCC # tests to fail because promotion rules are different. Just let # the language be set to the default. if { ![runto_main] } { gdb_suppress_tests; } # However, turn off overload-resolution for aCC. Having it on causes # a lot of failures. gdb_test "set overload-resolution 0" ".*"} else { if { ![set_lang_c] } { gdb_suppress_tests; } else { if { ![runto_main] } { gdb_suppress_tests; } }}get_debug_format# Make sure that malloc gets called and that the floating point unit# is initialized via a call to t_double_values.gdb_test "next" "t_double_values\\(double_val1, double_val2\\);.*" \ "next to t_double_values"gdb_test "next" "t_structs_c\\(struct_val1\\);.*" \ "next to t_structs_c"# Save all register contents.do_get_all_registersset old_reg_content $all_registers_content# Perform function calls.do_function_calls# Check if all registers still have the same value.do_get_all_registersset new_reg_content $all_registers_contentif ![string compare $old_reg_content $new_reg_content] then { pass "gdb function calls preserve register contents"} else { set old_reg_content $all_registers_content fail "gdb function calls preserve register contents"}# Set breakpoint at a function we will call from gdb.gdb_breakpoint add# Call function (causing a breakpoint hit in the call dummy) and do a continue,# make sure we are back at main and still have the same register contents.gdb_test "print add(4,5)" \ "The program being debugged stopped while.*" \ "stop at breakpoint in call dummy function"gdb_test "continue" "Continuing.*" "continue from call dummy breakpoint"if ![gdb_test "bt 2" \ "#0 main.*" \ "bt after continuing from call dummy breakpoint"] then { do_get_all_registers set new_reg_content $all_registers_content if ![string compare $old_reg_content $new_reg_content] then { pass "continue after stop in call dummy preserves register contents" } else { fail "continue after stop in call dummy preserves register contents" }}# Call function (causing a breakpoint hit in the call dummy) and do a finish,# make sure we are back at main and still have the same register contents.gdb_test "print add(4,5)" "The program being debugged stopped while.*" \ "call function causing a breakpoint then do a finish"gdb_test "finish" \ "Value returned is .* = 9" \ "finish from call dummy breakpoint returns correct value"if ![gdb_test "bt 2" \ "#0 main.*" \ "bt after finishing from call dummy breakpoint"] then { do_get_all_registers set new_reg_content $all_registers_content if ![string compare $old_reg_content $new_reg_content] then { pass "finish after stop in call dummy preserves register contents" } else { fail "finish after stop in call dummy preserves register contents" }}# Call function (causing a breakpoint hit in the call dummy) and do a return# with a value, make sure we are back at main with the same register contents.gdb_test "print add(4,5)" "The program being debugged stopped while.*" \ "call function causing a breakpoint and then do a return"if ![gdb_test "return 7" \ "#0 main.*" \ "back at main after return from call dummy breakpoint" \ "Make add return now. .y or n.*" \ "y"] then { do_get_all_registers set new_reg_content $all_registers_content if ![string compare $old_reg_content $new_reg_content] then { pass "return after stop in call dummy preserves register contents" } else { fail "return after stop in call dummy preserves register contents" }}# Call function (causing a breakpoint hit in the call dummy), and# call another function from the call dummy frame (thereby setting up# several nested call dummy frames). Test that backtrace and finish# work when several call dummies are nested.gdb_breakpoint sum10gdb_breakpoint t_small_valuesgdb_test "print add(2,3)" "The program being debugged stopped while.*" \ "stop at nested call level 1"gdb_test "backtrace" \ "\#0 add \\(a=2, b=3\\).*\#1 <function called from gdb>.*\#2 main.*" \ "backtrace at nested call level 1"gdb_test "print add(4,5)" "The program being debugged stopped while.*" \ "stop at nested call level 2"gdb_test "backtrace" \ "\#0 add \\(a=4, b=5\\).*\#1 <function called from gdb>.*\#2 add \\(a=2, b=3\\).*\#3 <function called from gdb>.*\#4 main.*" \ "backtrace at nested call level 2"gdb_test "print sum10(2,4,6,8,10,12,14,16,18,20)" \ "The program being debugged stopped while.*" \ "stop at nested call level 3"gdb_test "backtrace" \ "\#0 sum10 \\(i0=2, i1=4, i2=6, i3=8, i4=10, i5=12, i6=14, i7=16, i8=18, i9=20\\).*\#1 <function called from gdb>.*\#2 add \\(a=4, b=5\\).*\#3 <function called from gdb>.*\#4 add \\(a=2, b=3\\).*\#5 <function called from gdb>.*\#6 main.*" \ "backtrace at nested call level 3"gdb_test "print t_small_values(1,3,5,7,9,11,13,15,17,19)" \ "The program being debugged stopped while.*" \ "stop at nested call level 4"gdb_test "backtrace" \ "\#0 t_small_values \\(arg1=1 '.001', arg2=3, arg3=5, arg4=7 '.a', arg5=9, arg6=11 '.v', arg7=13, arg8=15, arg9=17, arg10=19\\).*\#2 sum10 \\(i0=2, i1=4, i2=6, i3=8, i4=10, i5=12, i6=14, i7=16, i8=18, i9=20\\).*\#3 <function called from gdb>.*\#4 add \\(a=4, b=5\\).*\#5 <function called from gdb>.*\#6 add \\(a=2, b=3\\).*\#7 <function called from gdb>.*\#8 main.*" \ "backtrace at nested call level 4"gdb_test "finish" "Value returned is .* = 100" \ "Finish from nested call level 4"gdb_test "backtrace" \ "\#0 sum10 \\(i0=2, i1=4, i2=6, i3=8, i4=10, i5=12, i6=14, i7=16, i8=18, i9=20\\).*\#1 <function called from gdb>.*\#2 add \\(a=4, b=5\\).*\#3 <function called from gdb>.*\#4 add \\(a=2, b=3\\).*\#5 <function called from gdb>.*\#6 main.*" \ "backtrace after finish from nested call level 4"gdb_test "finish" "Value returned is .* = 110" \ "Finish from nested call level 3"gdb_test "backtrace" \ "\#0 add \\(a=4, b=5\\).*\#1 <function called from gdb>.*\#2 add \\(a=2, b=3\\).*\#3 <function called from gdb>.*\#4 main.*" \ "backtrace after finish from nested call level 3"gdb_test "finish" "Value returned is .* = 9" \ "Finish from nested call level 2"gdb_test "backtrace" \ "\#0 add \\(a=2, b=3\\).*\#1 <function called from gdb>.*\#2 main.*" \ "backtrace after finish from nested call level 2"gdb_test "finish" "Value returned is .* = 5" \ "Finish from nested call level 1"gdb_test "backtrace" "\#0 main .*" \ "backtrace after finish from nested call level 1"do_get_all_registersset new_reg_content $all_registers_contentif ![string compare $old_reg_content $new_reg_content] then { pass "nested call dummies preserve register contents"} else { fail "nested call dummies preserve register contents"}return 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -