⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callfuncs.exp

📁 gdb-6.8 Linux下的调试程序 最新版本
💻 EXP
📖 第 1 页 / 共 2 页
字号:
	"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.proc fetch_all_registers {test} {    global gdb_prompt    set all_registers_lines {}    set bad -1    if {[gdb_test_multiple "info all-registers" $test {	-re "info all-registers\[\r\n\]+" {	    exp_continue	}	-ex "The program has no registers now" {	    set bad 1	    exp_continue	}	-re "^bspstore\[ \t\]+\[^\r\n\]+\[\r\n\]+" {	    if [istarget "ia64-*-*"] {		# Filter out bspstore which is specially tied to bsp,		# giving spurious differences.	    } else {		lappend all_registers_lines $expect_out(0,string)	    }	    exp_continue	}	-re "^\[^ \t\]+\[ \t\]+\[^\r\n\]+\[\r\n\]+" {	    lappend all_registers_lines $expect_out(0,string)	    exp_continue	}	-re ".*$gdb_prompt $" {	    incr bad	}	-re "^\[^\r\n\]+\[\r\n\]+" {	    if {!$bad} {		warning "Unrecognized output: $expect_out(0,string)"		set bad 1	    }	    exp_continue	}    }] != 0} {	return {}    }    if {$bad} {	fail $test	return {}    }    pass $test    return $all_registers_lines}# 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.set old_reg_content [fetch_all_registers "retrieve original register contents"]# Perform function calls.do_function_calls# Check if all registers still have the same value.set new_reg_content [fetch_all_registers \		     "register contents after gdb function calls"]if {$old_reg_content == $new_reg_content} then {    pass "gdb function calls preserve register contents"} else {    set old_reg_content $new_reg_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 {    set new_reg_content [fetch_all_registers \			 "register contents after stop in call dummy"]    if {$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 {    set new_reg_content [fetch_all_registers \			 "register contents after finish in call dummy"]    if {$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 {    set new_reg_content [fetch_all_registers \                         "register contents after return in call dummy"]    if {$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"set new_reg_content [fetch_all_registers \		     "register contents after nested call dummies"]if {$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 + -