1# Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file is part of the GDB testsuite. It tests the mechanism 17# exposing values to Python. 18 19if $tracelevel then { 20 strace $tracelevel 21} 22 23load_lib gdb-python.exp 24 25set testfile "py-value" 26set srcfile ${testfile}.c 27set binfile ${objdir}/${subdir}/${testfile} 28if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 29 untested "Couldn't compile ${srcfile}" 30 return -1 31} 32 33proc test_value_creation {} { 34 global gdb_prompt 35 36 gdb_py_test_silent_cmd "python i = gdb.Value (True)" "create boolean value" 1 37 gdb_py_test_silent_cmd "python i = gdb.Value (5)" "create integer value" 1 38 gdb_py_test_silent_cmd "python i = gdb.Value (5L)" "create long value" 1 39 gdb_py_test_silent_cmd "python f = gdb.Value (1.25)" "create double value" 1 40 gdb_py_test_silent_cmd "python a = gdb.Value ('string test')" "create 8-bit string value" 1 41 gdb_test "python print a" "\"string test\"" "print 8-bit string" 42 gdb_test "python print a.__class__" "<type 'gdb.Value'>" "verify type of 8-bit string" 43 gdb_py_test_silent_cmd "python a = gdb.Value (u'unicode test')" "create unicode value" 1 44 gdb_test "python print a" "\"unicode test\"" "print Unicode string" 45 gdb_test "python print a.__class__" "<type 'gdb.Value'>" "verify type of unicode string" 46 47 # Test address attribute is None in a non-addressable value 48 gdb_test "python print 'result =', i.address" "= None" "Test address attribute in non-addressable value" 49} 50 51proc test_value_numeric_ops {} { 52 global gdb_prompt 53 54 gdb_py_test_silent_cmd "python i = gdb.Value (5)" "create first integer value" 0 55 gdb_py_test_silent_cmd "python j = gdb.Value (2)" "create second integer value" 0 56 gdb_py_test_silent_cmd "python f = gdb.Value (1.25)" "create first double value" 0 57 gdb_py_test_silent_cmd "python g = gdb.Value (2.5)" "create second double value" 0 58 gdb_test "python print 'result = ' + str(i+j)" " = 7" "add two integer values" 59 gdb_test "python print (i+j).__class__" "<type 'gdb.Value'>" "verify type of integer add result" 60 61 gdb_test "python print 'result = ' + str(f+g)" " = 3.75" "add two double values" 62 gdb_test "python print 'result = ' + str(i-j)" " = 3" "subtract two integer values" 63 gdb_test "python print 'result = ' + str(f-g)" " = -1.25" "subtract two double values" 64 gdb_test "python print 'result = ' + str(i*j)" " = 10" "multiply two integer values" 65 gdb_test "python print 'result = ' + str(f*g)" " = 3.125" "multiply two double values" 66 gdb_test "python print 'result = ' + str(i/j)" " = 2" "divide two integer values" 67 gdb_test "python print 'result = ' + str(f/g)" " = 0.5" "divide two double values" 68 gdb_test "python print 'result = ' + str(i%j)" " = 1" "take remainder of two integer values" 69 # Remainder of float is implemented in Python but not in GDB's value system. 70 71 gdb_test "python print 'result = ' + str(i**j)" " = 25" "integer value raised to the power of another integer value" 72 gdb_test "python print 'result = ' + str(g**j)" " = 6.25" "double value raised to the power of integer value" 73 74 gdb_test "python print 'result = ' + str(-i)" " = -5" "negated integer value" 75 gdb_test "python print 'result = ' + str(+i)" " = 5" "positive integer value" 76 gdb_test "python print 'result = ' + str(-f)" " = -1.25" "negated double value" 77 gdb_test "python print 'result = ' + str(+f)" " = 1.25" "positive double value" 78 gdb_test "python print 'result = ' + str(abs(j-i))" " = 3" "absolute of integer value" 79 gdb_test "python print 'result = ' + str(abs(f-g))" " = 1.25" "absolute of double value" 80 81 # Test gdb.Value mixed with Python types. 82 83 gdb_test "python print 'result = ' + str(i-1)" " = 4" "subtract integer value from python integer" 84 gdb_test "python print (i-1).__class__" "<type 'gdb.Value'>" "verify type of mixed integer subtraction result" 85 gdb_test "python print 'result = ' + str(f+1.5)" " = 2.75" "add double value with python float" 86 87 gdb_test "python print 'result = ' + str(1-i)" " = -4" "subtract python integer from integer value" 88 gdb_test "python print 'result = ' + str(1.5+f)" " = 2.75" "add python float with double value" 89 90 # Conversion test. 91 gdb_test "print evalue" " = TWO" 92 gdb_test_no_output "python evalue = gdb.history (0)" 93 gdb_test "python print int (evalue)" "2" 94 95 # Test pointer arithmethic 96 97 # First, obtain the pointers 98 gdb_test "print (void *) 2" ".*" "" 99 gdb_test_no_output "python a = gdb.history (0)" "" 100 gdb_test "print (void *) 5" ".*" "" 101 gdb_test_no_output "python b = gdb.history (0)" "" 102 103 gdb_test "python print 'result = ' + str(a+5)" " = 0x7" "add pointer value with python integer" 104 gdb_test "python print 'result = ' + str(b-2)" " = 0x3" "subtract python integer from pointer value" 105 gdb_test "python print 'result = ' + str(b-a)" " = 3" "subtract two pointer values" 106 107 # Test some invalid operations. 108 109 gdb_test_multiple "python print 'result = ' + str(i+'foo')" "catch error in python type conversion" { 110 -re "Argument to arithmetic operation not a number or boolean.*$gdb_prompt $" {pass "catch error in python type conversion"} 111 -re "result = .*$gdb_prompt $" {fail "catch error in python type conversion"} 112 -re "$gdb_prompt $" {fail "catch error in python type conversion"} 113 } 114 115 gdb_test_multiple "python print 'result = ' + str(i+gdb.Value('foo'))" "catch throw of GDB error" { 116 -re "Traceback.*$gdb_prompt $" {pass "catch throw of GDB error"} 117 -re "result = .*$gdb_prompt $" {fail "catch throw of GDB error"} 118 -re "$gdb_prompt $" {fail "catch throw of GDB error"} 119 } 120} 121 122proc test_value_boolean {} { 123 # First, define a useful function to test booleans. 124 gdb_py_test_multiple "define function to test booleans" \ 125 "python" "" \ 126 "def test_bool (val):" "" \ 127 " if val:" "" \ 128 " print 'yay'" "" \ 129 " else:" "" \ 130 " print 'nay'" "" \ 131 "end" "" 132 133 gdb_test "py test_bool (gdb.Value (True))" "yay" "check evaluation of true boolean value in expression" 134 135 gdb_test "py test_bool (gdb.Value (False))" "nay" "check evaluation of false boolean value in expression" 136 137 gdb_test "py test_bool (gdb.Value (5))" "yay" "check evaluation of true integer value in expression" 138 139 gdb_test "py test_bool (gdb.Value (0))" "nay" "check evaluation of false integer value in expression" 140 141 gdb_test "py test_bool (gdb.Value (5.2))" "yay" "check evaluation of true integer value in expression" 142 143 gdb_test "py test_bool (gdb.Value (0.0))" "nay" "check evaluation of false integer value in expression" 144} 145 146proc test_value_compare {} { 147 gdb_test "py print gdb.Value (1) < gdb.Value (1)" "False" "less than, equal" 148 gdb_test "py print gdb.Value (1) < gdb.Value (2)" "True" "less than, less" 149 gdb_test "py print gdb.Value (2) < gdb.Value (1)" "False" "less than, greater" 150 gdb_test "py print gdb.Value (2) < None" "False" "less than, None" 151 152 gdb_test "py print gdb.Value (1) <= gdb.Value (1)" "True" "less or equal, equal" 153 gdb_test "py print gdb.Value (1) <= gdb.Value (2)" "True" "less or equal, less" 154 gdb_test "py print gdb.Value (2) <= gdb.Value (1)" "False" "less or equal, greater" 155 gdb_test "py print gdb.Value (2) <= None" "False" "less or equal, None" 156 157 gdb_test "py print gdb.Value (1) == gdb.Value (1)" "True" "equality of gdb.Values" 158 gdb_test "py print gdb.Value (1) == gdb.Value (2)" "False" "inequality of gdb.Values" 159 gdb_test "py print gdb.Value (1) == 1.0" "True" "equality of gdb.Value with Python value" 160 gdb_test "py print gdb.Value (1) == 2" "False" "inequality of gdb.Value with Python value" 161 gdb_test "py print gdb.Value (1) == None" "False" "inequality of gdb.Value with None" 162 163 gdb_test "py print gdb.Value (1) != gdb.Value (1)" "False" "inequality, false" 164 gdb_test "py print gdb.Value (1) != gdb.Value (2)" "True" "inequality, true" 165 gdb_test "py print gdb.Value (1) != None" "True" "inequality, None" 166 167 gdb_test "py print gdb.Value (1) > gdb.Value (1)" "False" "greater than, equal" 168 gdb_test "py print gdb.Value (1) > gdb.Value (2)" "False" "greater than, less" 169 gdb_test "py print gdb.Value (2) > gdb.Value (1)" "True" "greater than, greater" 170 gdb_test "py print gdb.Value (2) > None" "True" "greater than, None" 171 172 gdb_test "py print gdb.Value (1) >= gdb.Value (1)" "True" "greater or equal, equal" 173 gdb_test "py print gdb.Value (1) >= gdb.Value (2)" "False" "greater or equal, less" 174 gdb_test "py print gdb.Value (2) >= gdb.Value (1)" "True" "greater or equal, greater" 175 gdb_test "py print gdb.Value (2) >= None" "True" "greater or equal, None" 176} 177 178proc test_value_in_inferior {} { 179 global gdb_prompt 180 global testfile 181 182 gdb_breakpoint [gdb_get_line_number "break to inspect struct and union"] 183 184 gdb_continue_to_breakpoint "break to inspect struct and union" 185 186 # Just get inferior variable s in the value history, available to python. 187 gdb_test "print s" " = {a = 3, b = 5}" "" 188 189 gdb_py_test_silent_cmd "python s = gdb.history (0)" "get value from history" 1 190 191 gdb_test "python print 'result = ' + str(s\['a'\])" " = 3" "access element inside struct using 8-bit string name" 192 gdb_test "python print 'result = ' + str(s\[u'a'\])" " = 3" "access element inside struct using unicode name" 193 194 # Test dereferencing the argv pointer 195 196 # Just get inferior variable argv the value history, available to python. 197 gdb_test "print argv" " = \\(char \\*\\*\\) 0x.*" "" 198 199 gdb_py_test_silent_cmd "python argv = gdb.history (0)" "" 0 200 gdb_py_test_silent_cmd "python arg0 = argv.dereference ()" "dereference value" 1 201 202 # Check that the dereferenced value is sane 203 if { ! [target_info exists noargs] } { 204 gdb_test "python print arg0" "0x.*$testfile\"" "verify dereferenced value" 205 } 206 207 # Smoke-test is_optimized_out attribute 208 gdb_test "python print 'result =', arg0.is_optimized_out" "= False" "Test is_optimized_out attribute" 209 210 # Test address attribute 211 gdb_test "python print 'result =', arg0.address" "= 0x\[\[:xdigit:\]\]+" "Test address attribute" 212 213 # Test memory error. 214 gdb_test "python print gdb.parse_and_eval('*(int*)0')" "gdb.MemoryError: Cannot access memory at address 0x0.*" 215 216 # Test string fetches, both partial and whole. 217 gdb_test "print st" "\"divide et impera\"" 218 gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value from history" 1 219 gdb_test "python print st.string ()" "divide et impera" "Test string with no length" 220 gdb_test "python print st.string (length = -1)" "divide et impera" "Test string (length = -1) is all of the string" 221 gdb_test "python print st.string (length = 6)" "divide" 222 gdb_test "python print \"---\"+st.string (length = 0)+\"---\"" "------" "Test string (length = 0) is empty" 223 gdb_test "python print len(st.string (length = 0))" "0" "Test length is 0" 224 225 226 # Fetch a string that has embedded nulls. 227 gdb_test "print nullst" "\"divide\\\\000et\\\\000impera\".*" 228 gdb_py_test_silent_cmd "python nullst = gdb.history (0)" "get value from history" 1 229 gdb_test "python print nullst.string ()" "divide" "Test string to first null" 230 # Python cannot print strings that contain the null (\0) character. 231 # For the purposes of this test, use repr() 232 gdb_py_test_silent_cmd "python nullst = nullst.string (length = 9)" "get string beyond null" 1 233 gdb_test "python print repr(nullst)" "u'divide\\\\x00et'" 234} 235 236proc test_lazy_strings {} { 237 238 global hex 239 240 gdb_test "print sptr" "\"pointer\"" 241 gdb_py_test_silent_cmd "python sptr = gdb.history (0)" "Get value from history" 1 242 243 gdb_py_test_silent_cmd "python lstr = sptr.lazy_string()" "Aquire lazy string" 1 244 gdb_test "python print lstr.type" "const char \*." "Test type name equality" 245 gdb_test "python print sptr.type" "const char \*." "Test type name equality" 246 gdb_test "print sn" "0x0" 247 gdb_py_test_silent_cmd "python snptr = gdb.history (0)" "Get value from history" 1 248 gdb_test "python snstr = snptr.lazy_string(length=5)" ".*Cannot create a lazy string with address.*" "Test lazy string" 249 gdb_py_test_silent_cmd "python snstr = snptr.lazy_string(length=0)" "Succesfully create a lazy string" 1 250 gdb_test "python print snstr.length" "0" "Test lazy string length" 251 gdb_test "python print snstr.address" "0" "Test lazy string address" 252} 253 254 255proc test_inferior_function_call {} { 256 global gdb_prompt hex decimal 257 258 # Correct inferior call without arguments. 259 gdb_test "p/x fp1" " = $hex.*" 260 gdb_py_test_silent_cmd "python fp1 = gdb.history (0)" "get value from history" 1 261 gdb_test "python fp1 = fp1.dereference()" "" 262 gdb_test "python result = fp1()" "" 263 gdb_test "python print result" "void" 264 265 # Correct inferior call with arguments. 266 gdb_test "p/x fp2" " = $hex.*" 267 gdb_py_test_silent_cmd "python fp2 = gdb.history (0)" "get value from history" 1 268 gdb_test "python fp2 = fp2.dereference()" "" 269 gdb_test "python result2 = fp2(10,20)" "" 270 gdb_test "python print result2" "30" 271 272 # Incorrect to call an int value. 273 gdb_test "p i" " = $decimal.*" 274 gdb_py_test_silent_cmd "python i = gdb.history (0)" "get value from history" 1 275 gdb_test "python result3 = i()" ".*Value is not callable.*" 276 277 # Incorrect number of arguments. 278 gdb_test "p/x fp2" " = $hex.*" 279 gdb_py_test_silent_cmd "python fp3 = gdb.history (0)" "get value from history" 1 280 gdb_test "python fp3 = fp3.dereference()" "" 281 gdb_test "python result2 = fp3(10)" ".*Too few arguments in function call.*" 282} 283 284# A few objfile tests. 285proc test_objfiles {} { 286 gdb_test "python\nok=False\nfor file in gdb.objfiles():\n if 'py-value' in file.filename:\n ok=True\nprint ok\nend" "True" 287 288 gdb_test "python print gdb.objfiles()\[0\].pretty_printers" "\\\[\\\]" 289 290 gdb_test "python gdb.objfiles()\[0\].pretty_printers = 0" \ 291 "pretty_printers attribute must be a list.*Error while executing Python code." 292} 293 294proc test_value_after_death {} { 295 # Construct a type while the inferior is still running. 296 gdb_py_test_silent_cmd "python ptrtype = gdb.lookup_type('PTR')" \ 297 "create PTR type" 1 298 299 # Kill the inferior and remove the symbols. 300 gdb_test "kill" "" "kill the inferior" \ 301 "Kill the program being debugged. .y or n. $" \ 302 "y" 303 gdb_test "file" "" "Discard the symbols" \ 304 "Discard symbol table from.*y or n. $" \ 305 "y" 306 307 # Now create a value using that type. Relies on arg0, created by 308 # test_value_in_inferior. 309 gdb_py_test_silent_cmd "python castval = arg0.cast(ptrtype.pointer())" \ 310 "cast arg0 to PTR" 1 311 312 # Make sure the type is deleted. 313 gdb_py_test_silent_cmd "python ptrtype = None" \ 314 "delete PTR type" 1 315 316 # Now see if the value's type is still valid. 317 gdb_test "python print castval.type" "PTR ." \ 318 "print value's type" 319} 320 321# Regression test for invalid subscript operations. The bug was that 322# the type of the value was not being checked before allowing a 323# subscript operation to proceed. 324 325proc test_subscript_regression {lang} { 326 327 global srcdir subdir srcfile binfile testfile hex 328 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug $lang"] != "" } { 329 untested "Couldn't compile ${srcfile} in $lang mode" 330 return -1 331 } 332 333 # Start with a fresh gdb. 334 gdb_exit 335 gdb_start 336 gdb_reinitialize_dir $srcdir/$subdir 337 gdb_load ${binfile} 338 339 if ![runto_main ] then { 340 perror "couldn't run to breakpoint" 341 return 342 } 343 344 if {$lang == "c++"} { 345 gdb_breakpoint [gdb_get_line_number "break to inspect pointer by reference"] 346 gdb_continue_to_breakpoint "break to inspect pointer by reference" 347 348 gdb_py_test_silent_cmd "print rptr_int" \ 349 "Obtain address" 1 350 gdb_py_test_silent_cmd "python rptr = gdb.history(0)" \ 351 "Obtains value from GDB" 1 352 gdb_test "python print rptr\[0\]" "2" "Check pointer passed as reference" 353 354 # Just the most basic test of dynamic_cast -- it is checked in 355 # the C++ tests. 356 gdb_test "python print bool(gdb.parse_and_eval('base').dynamic_cast(gdb.lookup_type('Derived').pointer()))" \ 357 True 358 359 # Likewise. 360 gdb_test "python print gdb.parse_and_eval('base').dynamic_type" \ 361 "Derived \[*\]" 362 # A static type case. 363 gdb_test "python print gdb.parse_and_eval('5').dynamic_type" \ 364 "int" 365 } 366 367 gdb_breakpoint [gdb_get_line_number "break to inspect struct and union"] 368 gdb_continue_to_breakpoint "break to inspect struct and union" 369 370 gdb_py_test_silent_cmd "python intv = gdb.Value(1)" \ 371 "Create a value for subscript test" 1 372 gdb_py_test_silent_cmd "python stringv = gdb.Value(\"foo\")" \ 373 "Create a value for subscript test" 1 374 375 # Try to access an int with a subscript. This should fail. 376 gdb_test "python print intv" "1" "Baseline print of a Python value" 377 gdb_test "python print intv\[0\]" "gdb.error: Cannot subscript requested type.*" \ 378 "Attempt to access an integer with a subscript" 379 380 # Try to access a string with a subscript. This should pass. 381 gdb_test "python print stringv" "foo." "Baseline print of a Python value" 382 gdb_test "python print stringv\[0\]" "f." "Attempt to access a string with a subscript" 383 384 # Try to access an int array via a pointer with a subscript. This should pass. 385 gdb_py_test_silent_cmd "print p" "Build pointer to array" 1 386 gdb_py_test_silent_cmd "python pointer = gdb.history(0)" "" 1 387 gdb_test "python print pointer\[0\]" "1" "Access array via pointer with int subscript" 388 gdb_test "python print pointer\[intv\]" "2" "Access array via pointer with value subscript" 389 390 # Try to access a single dimension array with a subscript to the 391 # result. This should fail. 392 gdb_test "python print pointer\[intv\]\[0\]" "gdb.error: Cannot subscript requested type.*" \ 393 "Attempt to access an integer with a subscript" 394 395 # Lastly, test subscript access to an array with multiple 396 # dimensions. This should pass. 397 gdb_py_test_silent_cmd "print {\"fu \",\"foo\",\"bar\"}" "Build array" 1 398 gdb_py_test_silent_cmd "python marray = gdb.history(0)" "" 1 399 gdb_test "python print marray\[1\]\[2\]" "o." "Test multiple subscript" 400} 401 402# A few tests of gdb.parse_and_eval. 403proc test_parse_and_eval {} { 404 gdb_test "python print gdb.parse_and_eval ('23')" "23" \ 405 "parse_and_eval constant test" 406 gdb_test "python print gdb.parse_and_eval ('5 + 7')" "12" \ 407 "parse_and_eval simple expression test" 408 gdb_test "python print type(gdb.parse_and_eval ('5 + 7'))" \ 409 ".type 'gdb.Value'."\ 410 "parse_and_eval type test" 411} 412 413# Test that values are hashable. 414proc test_value_hash {} { 415 gdb_py_test_multiple "Simple Python value dictionary" \ 416 "python" "" \ 417 "one = gdb.Value(1)" "" \ 418 "two = gdb.Value(2)" "" \ 419 "three = gdb.Value(3)" "" \ 420 "vdict = {one:\"one str\",two:\"two str\",three:\"three str\"}" "" \ 421 "end" 422 gdb_test "python print vdict\[one\]" "one str" "Test dictionary hash" 423 gdb_test "python print vdict\[two\]" "two str" "Test dictionary hash" 424 gdb_test "python print vdict\[three\]" "three str" "Test dictionary hash" 425 gdb_test "python print one.__hash__() == hash(one)" "True" "Test inbuilt hash" 426} 427 428 429# Start with a fresh gdb. 430 431gdb_exit 432gdb_start 433gdb_reinitialize_dir $srcdir/$subdir 434gdb_load ${binfile} 435 436# Skip all tests if Python scripting is not enabled. 437if { [skip_python_tests] } { continue } 438 439test_value_creation 440test_value_numeric_ops 441test_value_boolean 442test_value_compare 443test_objfiles 444test_parse_and_eval 445test_value_hash 446 447# The following tests require execution. 448 449if ![runto_main] then { 450 fail "Can't run to main" 451 return 0 452} 453 454test_value_in_inferior 455test_inferior_function_call 456test_lazy_strings 457test_value_after_death 458 459# The following test recompiles the binary to test either C or C++ 460# values. 461test_subscript_regression "c++" 462test_subscript_regression "c" 463