X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.python%2Fpython.exp;h=f6bf93add0d346259d4bbaccf3b598829d3b9e7d;hb=56bcdbea2b;hp=301245bf114722ee2dd1f47691f7a6933c93dc12;hpb=a2c09bd0c7148be4ed1b9631905ebe891204be1a;p=thirdparty%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp index 301245bf114..f6bf93add0d 100644 --- a/gdb/testsuite/gdb.python/python.exp +++ b/gdb/testsuite/gdb.python/python.exp @@ -1,4 +1,4 @@ -# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. +# Copyright (C) 2008-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,20 +16,12 @@ # This file is part of the GDB testsuite. It tests the mechanism # exposing values to Python. -if $tracelevel then { - strace $tracelevel -} - load_lib gdb-python.exp -set testfile "python" -set srcfile ${testfile}.c -set srcfile1 ${testfile}-1.c -set binfile ${objdir}/${subdir}/${testfile} +standard_testfile python.c python-1.c -if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1}" \ - ${binfile} executable {debug}] != "" } { - untested "Could not compile $binfile." +if {[build_executable $testfile.exp $testfile \ + [list $srcfile $srcfile2] debug] == -1} { return -1 } @@ -38,70 +30,97 @@ gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir -# Skip all tests if Python scripting is not enabled. -if { [skip_python_tests] } { continue } +set remote_source2_py [gdb_remote_download host \ + ${srcdir}/${subdir}/source2.py] -gdb_test_multiple "python print 23" "verify python support" { +# Do this instead of the skip_python_check. +# We want to do some tests when Python is not present. +gdb_test_multiple "python print (23)" "verify python support" { -re "not supported.*$gdb_prompt $" { unsupported "python support is disabled" # If Python is not supported, verify that sourcing a python script # causes an error. - gdb_test "source $srcdir/$subdir/source2.py" "Error in sourced command file:.*" + gdb_test "source $remote_source2_py" \ + "Error in sourced command file:.*" \ + "source source2.py when python disabled" + + # Verify multi-line python commands cause an error. + gdb_py_test_multiple "multi-line python command" \ + "python" "" \ + "print (23)" "" \ + "end" "not supported.*" + return -1 } -re "$gdb_prompt $" {} } -# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... -# Run a test named NAME, consisting of multiple lines of input. -# After each input line INPUT, search for result line RESULT. -# Succeed if all results are seen; fail otherwise. -proc gdb_py_test_multiple {name args} { - global gdb_prompt - foreach {input result} $args { - if {[gdb_test_multiple $input "$name - $input" { - -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { - pass "$name - $input" - } - }]} { - return 1 - } - } - return 0 -} - gdb_py_test_multiple "multi-line python command" \ "python" "" \ - "print 23" "" \ + "print (23)" "" \ "end" "23" +# Spawn interactive Python help from a multi-line command, thus, after +# a secondary prompt. + +with_test_prefix "python interactive help" { + set test "python; help(); end" + gdb_test_multiple "python\nhelp()\nend" $test { + -re ".*help utility.*help> $" { + pass $test + + # The "quit" must be seen on the output. A buggy GDB + # would not display it. + gdb_test "quit" "^quit.*leaving help.*" "quit help" + } + } +} + gdb_py_test_multiple "show python command" \ "define zzq" "Type commands for definition of .* just \"end\"\\.*" \ "python" "" \ - "print 23" "" \ + "print (23)" "" \ "end" "" \ "end" "" \ - "show user zzq" "User command \"zzq\":.* python.*print 23.* end" + "show user zzq" "User command \"zzq\":.* python.*print \\(23\\).* end" gdb_py_test_multiple "indented multi-line python command" \ "python" "" \ "def foo ():" "" \ - " print 'hello, world!'" "" \ + " print ('hello, world!')" "" \ "foo ()" "" \ "end" "hello, world!" -gdb_test "source $srcdir/$subdir/source2.py" "yes" +gdb_test "source $remote_source2_py" "yes" "source source2.py" + +gdb_test "source -s source2.py" "yes" "source -s source2.py" + +set remote_source2_symlink_notpy \ + [gdb_remote_download host ${srcdir}/${subdir}/source2.py \ + [standard_output_file "source2-symlink.notpy"]] +set remote_source2_symlink_py [standard_output_file "source2-symlink.py"] +remote_file host delete $remote_source2_symlink_py +set status [remote_exec host "ln -sf $remote_source2_symlink_notpy $remote_source2_symlink_py"] +set test "source -s source2-symlink.py" +if {[lindex $status 0] == 0} { + gdb_test "source -s $remote_source2_symlink_py" "yes" $test +} else { + unsupported "$test (host does not support symbolic links)" +} -gdb_test "python print gdb.current_objfile()" "None" -gdb_test "python print gdb.objfiles()" "\\\[\\\]" +gdb_test "python print (gdb.current_objfile())" "None" +gdb_test "python print (gdb.objfiles())" "\\\[\\\]" # Test http://bugs.python.org/issue4434 workaround in configure.ac -gdb_test "python import itertools; print 'IMPOR'+'TED'" "IMPORTED" "pythonX.Y/lib-dynload/*.so" +gdb_test "python import itertools; print ('IMPOR'+'TED')" "IMPORTED" "pythonX.Y/lib-dynload/*.so" gdb_test_no_output \ "python x = gdb.execute('printf \"%d\", 23', to_string = True)" -gdb_test "python print x" "23" +gdb_test "python print (x)" "23" + +gdb_test "python gdb.execute('echo 2\\necho 3\\\\n\\n')" "23" \ + "multi-line execute" # Test post_event. gdb_py_test_multiple "post event insertion" \ @@ -114,8 +133,8 @@ gdb_py_test_multiple "post event insertion" \ "gdb.post_event(Foo())" "" \ "end" "" -gdb_test "python print someVal" "1" "test post event execution" -gdb_test "python gdb.post_event(str(1))" "RuntimeError: Posted event is not callable.*" "Test non callable class" +gdb_test "python print (someVal)" "1" "test post event execution" +gdb_test "python gdb.post_event(str(1))" "RuntimeError: Posted event is not callable.*" "test non callable class" # Test (no) pagination of the executed command. gdb_test "show height" {Number of lines gdb thinks are in a page is unlimited\.} @@ -123,28 +142,63 @@ set lines 10 gdb_test_no_output "set height $lines" set test "verify pagination beforehand" -gdb_test_multiple "python print \"\\n\" * $lines" $test { - -re "---Type to continue, or q to quit---$" { +gdb_test_multiple "python print (\"\\n\" * $lines)" $test { + -re "---Type " { + exp_continue + } + -re " to continue, or q " { + exp_continue + } + -re " to quit---$" { pass $test } } -gdb_test "q" "Quit" "verify pagination beforehand: q" +gdb_test "q" "Quit.*Error while executing Python.*" "verify pagination beforehand: q" -gdb_test "python if gdb.execute('python print \"\\\\n\" * $lines', to_string=True) == \"\\n\" * [expr $lines + 1]: print \"yes\"" "yes" "gdb.execute does not page" +gdb_test "python if gdb.execute('python print (\"\\\\n\" * $lines)', to_string=True) == \"\\n\" * [expr $lines + 1]: print (\"yes\")" "yes" "gdb.execute does not page" set test "verify pagination afterwards" -gdb_test_multiple "python print \"\\n\" * $lines" $test { - -re "---Type to continue, or q to quit---$" { +gdb_test_multiple "python print (\"\\n\" * $lines)" $test { + -re "---Type " { + exp_continue + } + -re " to continue, or q " { + exp_continue + } + -re " to quit---$" { pass $test } } -gdb_test "q" "Quit" "verify pagination afterwards: q" +gdb_test "q" "Quit.*Error while executing Python.*" "verify pagination afterwards: q" gdb_test_no_output "set height 0" gdb_test_no_output "python a = gdb.execute('help', to_string=True)" "collect help from uiout" -gdb_test "python print a" ".*aliases -- Aliases of other commands.*" "verify help to uiout" +gdb_test "python print (a)" ".*aliases -- Aliases of other commands.*" "verify help to uiout" + +# Test PR 12212, using InfThread.selected_thread() when no inferior is +# loaded. +gdb_py_test_silent_cmd "python nothread = gdb.selected_thread()" "Attempt to aquire thread with no inferior" 1 +gdb_test "python print (nothread == None)" "True" "ensure that no threads are returned" + +gdb_py_test_multiple "register atexit function" \ + "python" "" \ + "import atexit" "" \ + "def printit(arg):" "" \ + " print (arg)" "" \ + "atexit.register(printit, 'good bye world')" "" \ + "end" "" + +send_gdb "quit\n" +gdb_expect { + -re "good bye world" { + pass "atexit handling" + } + default { + fail "atexit handling" + } +} # Start with a fresh gdb. clean_restart ${testfile} @@ -152,34 +206,274 @@ clean_restart ${testfile} # The following tests require execution. if ![runto_main] then { - fail "Can't run to main" + fail "can't run to main" return 0 } -runto [gdb_get_line_number "Break to end."] +set lineno [gdb_get_line_number "Break to end."] +runto $lineno # Test gdb.decode_line. gdb_test "python gdb.decode_line(\"main.c:43\")" \ - "RuntimeError: No source file named main.c.*" "test decode_line no source named main" + "gdb.error: No source file named main.c.*" "test decode_line no source named main" gdb_py_test_silent_cmd "python symtab = gdb.decode_line()" "test decode_line current location" 1 -gdb_test "python print len(symtab)" "2" "Test decode_line current location" -gdb_test "python print symtab\[0\]" "None" "Test decode_line expression parse" -gdb_test "python print len(symtab\[1\])" "1" "Test decode_line current location" -gdb_test "python print symtab\[1\]\[0\].symtab" "gdb/testsuite/gdb.python/python.c.*" "Test decode_line current locationn filename" -gdb_test "python print symtab\[1\]\[0\].line" "22" "Test decode_line current location line number" +gdb_test "python print (len(symtab))" "2" "test decode_line current location" +gdb_test "python print (symtab\[0\])" "None" "test decode_line expression parse" +gdb_test "python print (len(symtab\[1\]))" "1" "test decode_line current location" + +if { [is_remote host] } { + set python_c [string_to_regexp "python.c"] +} else { + set python_c [string_to_regexp "gdb.python/python.c"] +} +gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_c}" "test decode_line current location filename" +gdb_test "python print (symtab\[1\]\[0\].line)" "$lineno" "test decode_line current location line number" gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"python.c:26 if foo\")" "test decode_line python.c:26" 1 -gdb_test "python print len(symtab)" "2" "Test decode_line python.c:26 length" -gdb_test "python print symtab\[0\]" "if foo" "Test decode_line expression parse" -gdb_test "python print len(symtab\[1\])" "1" "Test decode_line python.c:26 length" -gdb_test "python print symtab\[1\]\[0\].symtab" "gdb/testsuite/gdb.python/python.c.*" "Test decode_line python.c:26 filename" -gdb_test "python print symtab\[1\]\[0\].line" "26" "Test decode_line python.c:26 line number" +gdb_test "python print (len(symtab))" "2" "test decode_line python.c:26 length" +gdb_test "python print (symtab\[0\])" "if foo" "test decode_line expression parse" +gdb_test "python print (len(symtab\[1\]))" "1" "test decode_line python.c:26 length" +gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_c}" "test decode_line python.c:26 filename" +gdb_test "python print (symtab\[1\]\[0\].line)" "26" "test decode_line python.c:26 line number" gdb_test "python gdb.decode_line(\"randomfunc\")" \ - "RuntimeError: Function \"randomfunc\" not defined.*" "test decode_line randomfunc" + "gdb.error: Function \"randomfunc\" not defined.*" "test decode_line randomfunc" gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"func1\")" "test decode_line func1()" 1 -gdb_test "python print len(symtab)" "2" "Test decode_line func1 length" -gdb_test "python print len(symtab\[1\])" "1" "Test decode_line func1 length" -gdb_test "python print symtab\[1\]\[0\].symtab" "gdb/testsuite/gdb.python/python-1.c.*" "Test decode_line func1 filename" -gdb_test "python print symtab\[1\]\[0\].line" "19" "Test decode_line func1 line number" +gdb_test "python print (len(symtab))" "2" "test decode_line func1 length" +gdb_test "python print (len(symtab\[1\]))" "1" "test decode_line func1 length" + +if { [is_remote host] } { + set python_1_c [string_to_regexp "python-1.c"] +} else { + set python_1_c [string_to_regexp "gdb.python/python-1.c"] +} +gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_1_c}" "test decode_line func1 filename" + +# Set a default value for func1_lineno in case we fail to fetch the line number +# below. +set func1_lineno "noline" + +# Fetch the line GDB thinks func1 starts at. This may change depending +# on the architecture and on how GDB handles the prologue of the function. +gdb_test_multiple "info line func1" "info line func1" { + -re "Line ($decimal) of .* starts at address $hex and ends at $hex \.\[\r\n\]+$gdb_prompt $" { + # Fetch the line number. + set func1_lineno $expect_out(1,string) + } +} + +gdb_test "python print (symtab\[1\]\[0\].line)" "$func1_lineno" "test decode_line func1 line number" +gdb_py_test_silent_cmd {python symtab = gdb.decode_line ("func1,func2")} \ + "test decode_line func1,func2" 1 +gdb_test {python print (symtab[0])} ",func2" "stop at comma in linespec" + +gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"*0\")" "Test decode_line *0" 1 +gdb_test "python print (len(symtab))" "2" "test decode_line *0 result length" +gdb_test "python print (symtab\[0\])" "None" "test decode_line *0 unparsed" +gdb_test "python print (len(symtab\[1\]))" "1" "test decode_line *0 locations length" +gdb_test "python print (symtab\[1\]\[0\].symtab)" "None" "test decode_line *0 filename" +gdb_test "python print (symtab\[1\]\[0\].pc)" "0" "test decode_line *0 pc" + +# gdb.write +gdb_test "python print (sys.stderr)" ".*gdb.GdbOutputErrorFile (instance|object) at.*" "test stderr location" +gdb_test "python print (sys.stdout)" ".*gdb.GdbOutputFile (instance|object) at.*" "test stdout location" +gdb_test "python gdb.write(\"Foo\\n\")" "Foo" "test default write" +gdb_test "python gdb.write(\"Error stream\\n\", stream=gdb.STDERR)" "Error stream" "test stderr write" +gdb_test "python gdb.write(\"Normal stream\\n\", stream=gdb.STDOUT)" "Normal stream" "test stdout write" +gdb_test "python gdb.write(\"Log stream\\n\", stream=gdb.STDLOG)" "Log stream" "test stdlog write" + +# Turn on full stack printing for subsequent tests. +gdb_py_test_silent_cmd "set python print-stack full" \ + "Set print-stack full for prompt tests" 1 + +# Test prompt substituion + +gdb_py_test_multiple "prompt substitution" \ + "python" "" \ + "someCounter = 0" "" \ + "def prompt(current):" "" \ + " global someCounter" "" \ + " if (current == \"testfake \"):" "" \ + " return None" "" \ + " someCounter = someCounter + 1" "" \ + " return \"py prompt \" + str (someCounter) + \" \"" "" \ + "end" "" + +gdb_py_test_multiple "prompt substitution readline" \ + "python" "" \ + "pCounter = 0" "" \ + "def program_prompt(current):" "" \ + " global pCounter" "" \ + " if (current == \">\"):" "" \ + " pCounter = pCounter + 1" "" \ + " return \"python line \" + str (pCounter) + \": \"" "" \ + " return None" "" \ + "end" "" + +set newprompt "py prompt 1" +set newprompt2 "py prompt 2" +set testfake "testfake" + +gdb_test_multiple "python gdb.prompt_hook = prompt" "set the hook" { + -re "\[\r\n\]$newprompt $" { + pass "set hook" + } +} + +gdb_test_multiple "set prompt testfake " "set testfake prompt in GDB" { + -re "\[\r\n\]$testfake $" { + pass "set prompt testfake" + } +} + +gdb_test_multiple "show prompt" "show testfake prompt" { + -re "Gdb's prompt is \"$testfake \"..* $" { + pass "show prompt shows guarded prompt" + } +} + +gdb_test_multiple "set prompt blah " "set blah in GDB" { + -re "\[\r\n\]$newprompt2 $" { + pass "set prompt blah overriden" + } +} + +gdb_test_multiple "python gdb.prompt_hook = None" "delete hook" { + -re "\[\r\n\]$newprompt2 $" { + pass "delete old hook" + } +} + +gdb_test_multiple "set prompt $gdb_prompt " "set default prompt" { + -re "\[\r\n\]$gdb_prompt $" { + pass "set default prompt" + } +} + +set working_dir "" +gdb_test_multiple "pwd" "pwd" { + -re "Working directory (.*)\\.\[\r\n\]+$gdb_prompt $" { + set working_dir $expect_out(1,string) + } +} + +gdb_test_multiple "python gdb.prompt_hook = program_prompt" "set the hook" { + -re "\[\r\n\]$gdb_prompt $" { + pass "set programming hook" + } +} + +gdb_test_multiple "python" "test we ignore substituion for seconday prompts" { + -re "\r\n>$" { + pass "readline secondary are not substituted" + } +} + +gdb_test_multiple "end" "end programming" { + -re "\[\r\n\]$gdb_prompt $" { + pass "end programming" + } +} + +gdb_py_test_multiple "prompt substitution readline" \ + "python" "" \ + "import gdb.command.prompt" "" \ + "end" "" + +gdb_test_multiple "set extended-prompt one two three " \ + "set basic extended prompt" { + -re "\[\r\n\]one two three $" { + pass "set basic extended prompt" + } +} + +gdb_test_multiple "set extended-prompt \\w " \ + "set extended prompt working directory" { + -re "\[\r\n\][string_to_regexp $working_dir] $" { + pass "set extended prompt working directory" + } +} + +gdb_test_multiple "set extended-prompt some param \\p{python print-stack} " \ + "set extended prompt parameter" { + -re "\[\r\n\]some param full $" { + pass "set extended prompt parameter" + } +} + +# Start with a fresh gdb. +clean_restart ${testfile} + +# The following tests require execution. + +if ![runto_main] then { + fail "can't run to main" + return 0 +} + +# print-stack settings +gdb_test "show python print-stack" \ + "The mode of Python stack printing on error is \"message\".*" \ + "Test print-stack show setting. Default is message." +gdb_py_test_silent_cmd "set python print-stack full" \ + "Test print-stack set setting to full" 1 +gdb_test "show python print-stack" \ + "The mode of Python stack printing on error is \"full\".*" \ + "Test print-stack show setting to full" +gdb_py_test_silent_cmd "set python print-stack none" \ + "Test print-stack set setting to none" 1 +gdb_test "show python print-stack" \ + "The mode of Python stack printing on error is \"none\".*" \ + "test print-stack show setting to none" + +gdb_py_test_silent_cmd "set python print-stack message" \ + "Test print-stack set setting to message" 1 + +gdb_py_test_multiple "prompt substitution readline" \ + "python" "" \ + "pCounter = 0" "" \ + "def error_prompt(current):" "" \ + " raise RuntimeError(\"Python exception called\")" "" \ + "end" "" + +gdb_test_multiple "python gdb.prompt_hook = error_prompt" "set the hook" { + -re "Python Exception (exceptions.RuntimeError|<(type 'exceptions.|class ')RuntimeError'>) Python exception called.*" { + pass "set hook" + } +} + +gdb_py_test_silent_cmd "python gdb.prompt_hook = None" \ + "set the hook to default" 1 + +gdb_py_test_silent_cmd "set python print-stack full" \ + "set print-stack full for prompt error test" 1 + +gdb_test_multiple "python gdb.prompt_hook = error_prompt" "set the hook" { + -re "Traceback.*File.*line.*RuntimeError.*Python exception called.*" { + pass "set hook" + } +} + +gdb_py_test_silent_cmd "python gdb.prompt_hook = None" \ + "set the hook to default" 1 + +# Start with a fresh gdb. +clean_restart ${testfile} + +# The following tests require execution. + +if ![runto_main] then { + fail "can't run to main" + return 0 +} + +runto [gdb_get_line_number "Break at func2 call site."] + +gdb_py_test_silent_cmd "python line = gdb.selected_frame().find_sal().line" "Get line number of func2 call site" 1 +gdb_test "python print (gdb.find_pc_line(gdb.selected_frame().pc()).line == line)" "True" "test find_pc_line at func2 call site" + +gdb_py_test_silent_cmd "step" "Step into func2" 1 +gdb_py_test_silent_cmd "up" "Step out of func2" 1 + +gdb_test "python print (gdb.find_pc_line(gdb.selected_frame().pc()).line > line)" "True" "test find_pc_line with resume address"