
PR 13098 explains that if a user attempts to use a string with either `printf' (or `eval'), gdb returns an error (inferior not running): (gdb) printf "%s\n", "hello" evaluation of this expression requires the target program to be active However, the parser can certainly handle this case: (gdb) p "hello" $1 = "hello" This discrepancy occurs because printf_c_string does not handle this specific case. The passed-in value that we are attempting to print as a string is TYPE_CODE_ARRAY but it's lval type is not_lval. printf_c_string will only attempt to print a string from the value's contents when !TYPE_CODE_PTR, lval is lval_internalvar, and the value's type is considered a string type: if (value->type ()->code () != TYPE_CODE_PTR && value->lval () == lval_internalvar && c_is_string_type_p (value->type ())) { ... } Otherwise, it attempts to read the value of the string from the target's memory (which is what actually generates the "evaluation of this ..." error message).
38 lines
1.3 KiB
Text
38 lines
1.3 KiB
Text
# Copyright 2010-2023 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
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
|
|
gdb_test_no_output "set \$a = 10" "initialize \$a."
|
|
|
|
gdb_test "eval \"echo %d\\n\", \$a++" "10" "first eval."
|
|
gdb_test "eval \"echo %d\\n\", \$a*2" "22" "second eval."
|
|
|
|
gdb_test_no_output "set var \$hi = \"Hi\""
|
|
gdb_test {eval "echo %s, %s%c\n", $hi, "mom", '!'} "Hi, mom!"
|
|
|
|
set listsize_value -1
|
|
gdb_test_multiple "show listsize" "get listsize value" {
|
|
-re "Number of source lines gdb will list by default is (\[0-9\]+)\.\r\n$gdb_prompt $" {
|
|
set listsize_value $expect_out(1,string)
|
|
}
|
|
}
|
|
|
|
if {$listsize_value > -1} {
|
|
gdb_test {eval "echo %s\n", $_gdb_setting_str("listsize")} $listsize_value
|
|
} else {
|
|
send_log "warning: could not get listsize\n"
|
|
}
|