2019-01-01 14:01:51 +08:00
|
|
|
# Copyright 2015-2019 Free Software Foundation, Inc.
|
Add negative repeat count to 'x' command
This change adds support for specifying a negative repeat count to
all the formats of the 'x' command to examine memory backward.
A new testcase 'examine-backward' is added to cover this new feature.
Here's the example output from the new feature:
<format 'i'>
(gdb) bt
#0 Func1 (n=42, p=0x40432e "hogehoge") at main.cpp:5
#1 0x00000000004041fa in main (argc=1, argv=0x7fffffffdff8) at main.cpp:19
(gdb) x/-4i 0x4041fa
0x4041e5 <main(int, char**)+11>: mov %rsi,-0x10(%rbp)
0x4041e9 <main(int, char**)+15>: lea 0x13e(%rip),%rsi
0x4041f0 <main(int, char**)+22>: mov $0x2a,%edi
0x4041f5 <main(int, char**)+27>: callq 0x404147
<format 'x'>
(gdb) x/-4xw 0x404200
0x4041f0 <main(int, char**)+22>: 0x00002abf 0xff4de800 0x76e8ffff 0xb8ffffff
(gdb) x/-4
0x4041e0 <main(int, char**)+6>: 0x7d8910ec 0x758948fc 0x358d48f0 0x0000013e
gdb/ChangeLog:
* NEWS: Mention that GDB now supports a negative repeat count in
the 'x' command.
* printcmd.c (decode_format): Allow '-' in the parameter
"string_ptr" to accept a negative repeat count.
(find_instruction_backward): New function.
(read_memory_backward): New function.
(integer_is_zero): New function.
(find_string_backward): New function.
(do_examine): Use new functions to examine memory backward.
(_initialize_printcmd): Mention that 'x' command supports a negative
repeat count.
gdb/doc/ChangeLog:
* gdb.texinfo (Examining Memory): Document negative repeat
count in the 'x' command.
gdb/testsuite/ChangeLog:
* gdb.base/examine-backward.c: New file.
* gdb.base/examine-backward.exp: New file.
2016-06-10 13:47:42 +08:00
|
|
|
|
|
|
|
# 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/>.
|
|
|
|
|
|
|
|
# This testsuite is to test examining memory backward by specifying a negative
|
|
|
|
# number in the 'x' command.
|
|
|
|
|
|
|
|
standard_testfile
|
|
|
|
if { [prepare_for_testing "failed to prepare for examine-backward" \
|
|
|
|
${testfile} ${srcfile}] } {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
if ![runto_main] {
|
|
|
|
untested "could not run to main"
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
proc get_first_mapped_address {} {
|
|
|
|
global gdb_prompt
|
|
|
|
|
|
|
|
set addr "0"
|
|
|
|
gdb_test_multiple "info proc mappings" "info proc mappings" {
|
|
|
|
-re "objfile\[\r\n\t \]+(0x\[0-9a-fA-F\]+).*\[\r\n\]*$gdb_prompt $" {
|
|
|
|
set addr $expect_out(1,string)
|
|
|
|
}
|
|
|
|
-re "$gdb_prompt $" {
|
2016-12-02 04:40:05 +08:00
|
|
|
unsupported "current target does not support 'info proc mappings'"
|
Add negative repeat count to 'x' command
This change adds support for specifying a negative repeat count to
all the formats of the 'x' command to examine memory backward.
A new testcase 'examine-backward' is added to cover this new feature.
Here's the example output from the new feature:
<format 'i'>
(gdb) bt
#0 Func1 (n=42, p=0x40432e "hogehoge") at main.cpp:5
#1 0x00000000004041fa in main (argc=1, argv=0x7fffffffdff8) at main.cpp:19
(gdb) x/-4i 0x4041fa
0x4041e5 <main(int, char**)+11>: mov %rsi,-0x10(%rbp)
0x4041e9 <main(int, char**)+15>: lea 0x13e(%rip),%rsi
0x4041f0 <main(int, char**)+22>: mov $0x2a,%edi
0x4041f5 <main(int, char**)+27>: callq 0x404147
<format 'x'>
(gdb) x/-4xw 0x404200
0x4041f0 <main(int, char**)+22>: 0x00002abf 0xff4de800 0x76e8ffff 0xb8ffffff
(gdb) x/-4
0x4041e0 <main(int, char**)+6>: 0x7d8910ec 0x758948fc 0x358d48f0 0x0000013e
gdb/ChangeLog:
* NEWS: Mention that GDB now supports a negative repeat count in
the 'x' command.
* printcmd.c (decode_format): Allow '-' in the parameter
"string_ptr" to accept a negative repeat count.
(find_instruction_backward): New function.
(read_memory_backward): New function.
(integer_is_zero): New function.
(find_string_backward): New function.
(do_examine): Use new functions to examine memory backward.
(_initialize_printcmd): Mention that 'x' command supports a negative
repeat count.
gdb/doc/ChangeLog:
* gdb.texinfo (Examining Memory): Document negative repeat
count in the 'x' command.
gdb/testsuite/ChangeLog:
* gdb.base/examine-backward.c: New file.
* gdb.base/examine-backward.exp: New file.
2016-06-10 13:47:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return ${addr}
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "invalid format" {
|
|
|
|
gdb_test "x/- 10xb main" "Invalid number \"10xb\"\." \
|
|
|
|
"a whitespace after a leading hyphen"
|
|
|
|
gdb_test "x/--10xb main" "Invalid number \"10xb\"\." \
|
|
|
|
"double hyphen"
|
|
|
|
gdb_test "x/-a10xb main" "Invalid number \"10xb\"\." \
|
|
|
|
"an alphabet after a leading hyphen"
|
|
|
|
gdb_test_no_output "x/-0i main" "zero with backward disassemble"
|
|
|
|
gdb_test_no_output "x/-0sh main" "zero with backward examine string"
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "memory page boundary" {
|
|
|
|
set boundary [get_first_mapped_address]
|
|
|
|
if {![is_address_zero_readable] && $boundary != 0} {
|
|
|
|
gdb_test_no_output "set print elements 0"
|
|
|
|
gdb_test_sequence "x/3s ${boundary}" "take 3 strings forward" {
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/-4s" "take 4 strings backward" {
|
|
|
|
"Cannot access memory at address 0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/3s ${boundary}" "take 3 strings forward again" {
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/-3s" "take 3 strings backward" {
|
|
|
|
"Cannot access memory at address 0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
"0x"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "address zero boundary" {
|
gdb/testsuite: Allow for failure to read some memory addresses
In the gdb.base/examine-backward.exp test script, we check to see if
address zero is readable, and then read memory first forward from
address zero, and then backward from address zero.
The problem is, being able to read address zero does not guarantee
that you'll be able to read from the other end of the address space,
and the test probably shouldn't assume that is the case.
This patch updates the test script so that even if address zero is
known non-readable, we still run the tests, the tests in question are
mostly about, can GDB calculate the correct address to read from, we
can confirm this even if the final read ultimately fails. We also no
longer assume that if address zero is readable, then the other end of
the address space will be readable.
One further change is that, when we examined the memory at address
zero, the regexp used to match the address expected that the zero
address would have two '0' digits as the least significant digits. As
GDB strips leading zeros from addresses this was causing the test to
fail. I've reduced the zero address to a single 0 digit.
gdb/testsuite/ChangeLog:
* gdb.base/examine-backward.exp: Still run tests around address
0x0, even if address 0x0 is not readable. Update the pattern for
matching address 0x0 in expected output.
2018-02-02 23:51:31 +08:00
|
|
|
global gdb_prompt
|
|
|
|
|
|
|
|
set address_zero "0x0"
|
|
|
|
set byte "\t0x\[0-9a-f\]+"
|
|
|
|
|
|
|
|
set test "examine 3 bytes forward from ${address_zero}"
|
|
|
|
gdb_test_multiple "x/3xb ${address_zero}" "$test" {
|
|
|
|
-re "0x\[0-9a-f\]*0.*:${byte}${byte}${byte}\[\r\n\]*$gdb_prompt $" {
|
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
-re "0x\[0-9a-f\]*0.*:\tCannot access memory at address 0x\[0-9a-f\]*0\[\r\n\]*$gdb_prompt $" {
|
|
|
|
# If we failed to read address 0 then this is fine, so
|
|
|
|
# long as we're not expecting to be able to read from
|
|
|
|
# address 0.
|
|
|
|
if {![is_address_zero_readable]} {
|
|
|
|
# The next test assumes that the last address examined
|
|
|
|
# would be 0x2. As we just failed to read address 0x0
|
|
|
|
# things are going to go wrong unless we now tell GDB
|
|
|
|
# to examine address 0x2. We assume here that if we
|
|
|
|
# can't read 0x0 we can't read 0x2 either.
|
|
|
|
gdb_test "x/3xb 0x2" "Cannot access memory at address 0x\[0-9a-f\]*2" \
|
|
|
|
"set last examined address to 0x2"
|
|
|
|
pass $test
|
|
|
|
} else {
|
|
|
|
fail $test
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set test "examine 6 bytes backward"
|
|
|
|
gdb_test_multiple "x/-6x" "$test" {
|
|
|
|
-re "0x\[0-9a-f\]+fd.*:${byte}${byte}${byte}${byte}${byte}${byte}.*\[\r\n\]*$gdb_prompt $" {
|
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
-re "0x\[0-9a-f\]+fd.*:\tCannot access memory at address 0x\[0-9a-f\]+fd.*\[\r\n\]*$gdb_prompt $" {
|
|
|
|
# We may, or may not have managed to read from address 0x0
|
|
|
|
# in the previous test, however, being able to read 0x0 is
|
|
|
|
# no guarantee that we can read from the other end of the
|
|
|
|
# address space. If we get an error about trying to read
|
|
|
|
# from the expected address then we count that as a pass,
|
|
|
|
# GDB did try to read the correct location, and this test
|
|
|
|
# is (mostly) about does GDB calculate the correct address
|
|
|
|
# when wrapping around.
|
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set test "examine 3 bytes backward from ${address_zero}"
|
|
|
|
gdb_test_multiple "x/-3x ${address_zero}" "$test" {
|
|
|
|
-re "0x\[0-9a-f\]+fd.*:${byte}${byte}${byte}${byte}${byte}${byte}.*\[\r\n\]*$gdb_prompt $" {
|
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
-re "0x\[0-9a-f\]+fd.*:\tCannot access memory at address 0x\[0-9a-f\]+fd.*\[\r\n\]*$gdb_prompt $" {
|
|
|
|
# See previous test for why this is a pass.
|
|
|
|
pass $test
|
|
|
|
}
|
Add negative repeat count to 'x' command
This change adds support for specifying a negative repeat count to
all the formats of the 'x' command to examine memory backward.
A new testcase 'examine-backward' is added to cover this new feature.
Here's the example output from the new feature:
<format 'i'>
(gdb) bt
#0 Func1 (n=42, p=0x40432e "hogehoge") at main.cpp:5
#1 0x00000000004041fa in main (argc=1, argv=0x7fffffffdff8) at main.cpp:19
(gdb) x/-4i 0x4041fa
0x4041e5 <main(int, char**)+11>: mov %rsi,-0x10(%rbp)
0x4041e9 <main(int, char**)+15>: lea 0x13e(%rip),%rsi
0x4041f0 <main(int, char**)+22>: mov $0x2a,%edi
0x4041f5 <main(int, char**)+27>: callq 0x404147
<format 'x'>
(gdb) x/-4xw 0x404200
0x4041f0 <main(int, char**)+22>: 0x00002abf 0xff4de800 0x76e8ffff 0xb8ffffff
(gdb) x/-4
0x4041e0 <main(int, char**)+6>: 0x7d8910ec 0x758948fc 0x358d48f0 0x0000013e
gdb/ChangeLog:
* NEWS: Mention that GDB now supports a negative repeat count in
the 'x' command.
* printcmd.c (decode_format): Allow '-' in the parameter
"string_ptr" to accept a negative repeat count.
(find_instruction_backward): New function.
(read_memory_backward): New function.
(integer_is_zero): New function.
(find_string_backward): New function.
(do_examine): Use new functions to examine memory backward.
(_initialize_printcmd): Mention that 'x' command supports a negative
repeat count.
gdb/doc/ChangeLog:
* gdb.texinfo (Examining Memory): Document negative repeat
count in the 'x' command.
gdb/testsuite/ChangeLog:
* gdb.base/examine-backward.c: New file.
* gdb.base/examine-backward.exp: New file.
2016-06-10 13:47:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gdb_test_no_output "set charset ASCII"
|
|
|
|
|
|
|
|
with_test_prefix "char-width=1, print-max=20" {
|
|
|
|
gdb_test_no_output "set print elements 20"
|
|
|
|
gdb_test_sequence "x/6s &TestStrings" "take 6 strings forward" {
|
|
|
|
"\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"\"UVWXYZ\""
|
|
|
|
"\"\""
|
|
|
|
"\"\""
|
|
|
|
"\"[^\"]+\""
|
|
|
|
"\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-1xb" "0x39" "take 1 char backward"
|
|
|
|
gdb_test_sequence "x/-6s" "take 6 strings backward" {
|
|
|
|
"\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"\"UVWXYZ\""
|
|
|
|
"\"\""
|
|
|
|
"\"\""
|
|
|
|
"\"[^\"]+\""
|
|
|
|
"\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/6s &TestStrings" "take 6 strings forward again" {
|
|
|
|
"\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"\"UVWXYZ\""
|
|
|
|
"\"\""
|
|
|
|
"\"\""
|
|
|
|
"\"[^\"]+\""
|
|
|
|
"\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-xb" "0x39" "take 1 char backward again"
|
|
|
|
gdb_test "x/-s" "\"01234567890123456789\"\.\.\." \
|
|
|
|
"take 1 string backward (1/6)"
|
|
|
|
gdb_test "x/-s" "\".+\"" \
|
|
|
|
"take 1 string backward (2/6)"
|
|
|
|
gdb_test "x/-s" "\"\"" \
|
|
|
|
"take 1 string backward (3/6)"
|
|
|
|
gdb_test "x/-s" "\"\"" \
|
|
|
|
"take 1 string backward (4/6)"
|
|
|
|
gdb_test "x/-s" "\"GHIJKLMNOPQRSTUVWXYZ\"" \
|
|
|
|
"take 1 string backward (5/6)"
|
|
|
|
gdb_test "x/-s" "\"ABCDEFGHIJKLMNOPQRST\"\.\.\." \
|
|
|
|
"take 1 string backward (6/6)"
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "char-width=2, print-max=20" {
|
|
|
|
gdb_test_no_output "set print elements 20"
|
|
|
|
gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"u\"UVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"[^\"]+\""
|
|
|
|
"u\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-1xh" "0x0039" "take 1 char backward"
|
|
|
|
gdb_test_sequence "x/-6sh" "take 6 strings backward" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"u\"UVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"[^\"]+\""
|
|
|
|
"u\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward again" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"u\"UVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"[^\"]+\""
|
|
|
|
"u\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-xh" "0x0039" "take 1 char backward again"
|
|
|
|
gdb_test "x/-sh" "u\"01234567890123456789\"\.\.\." \
|
|
|
|
"take 1 string backward (1/6)"
|
|
|
|
gdb_test "x/-sh" "u\".+\"" \
|
|
|
|
"take 1 string backward (2/6)"
|
|
|
|
gdb_test "x/-sh" "u\"\"" \
|
|
|
|
"take 1 string backward (3/6)"
|
|
|
|
gdb_test "x/-sh" "u\"\"" \
|
|
|
|
"take 1 string backward (4/6)"
|
|
|
|
gdb_test "x/-sh" "u\"GHIJKLMNOPQRSTUVWXYZ\"" \
|
|
|
|
"take 1 string backward (5/6)"
|
|
|
|
gdb_test "x/-sh" "u\"ABCDEFGHIJKLMNOPQRST\"\.\.\." \
|
|
|
|
"take 1 string backward (6/6)"
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "char-width=4, print-max=20" {
|
|
|
|
gdb_test_no_output "set print elements 20"
|
|
|
|
gdb_test_sequence "x/6sw &TestStringsW" "take 6 strings forward" {
|
|
|
|
"U\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"U\"UVWXYZ\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"[^\"]+\""
|
|
|
|
"U\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-1xw" "0x00000039" "take 1 char backward"
|
|
|
|
gdb_test_sequence "x/-6sw" "take 6 strings backward" {
|
|
|
|
"U\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"U\"UVWXYZ\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"[^\"]+\""
|
|
|
|
"U\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/6sw &TestStringsW" "take 6 strings forward again" {
|
|
|
|
"U\"ABCDEFGHIJKLMNOPQRST\"\.\.\."
|
|
|
|
"U\"UVWXYZ\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"\""
|
|
|
|
"U\"[^\"]+\""
|
|
|
|
"U\"01234567890123456789\"\.\.\."
|
|
|
|
}
|
|
|
|
gdb_test "x/-xw" "0x00000039" "take 1 char backward again"
|
|
|
|
gdb_test "x/-sw" "U\"01234567890123456789\"\.\.\." \
|
|
|
|
"take 1 string backward (1/6)"
|
|
|
|
gdb_test "x/-sw" "U\".+\"" \
|
|
|
|
"take 1 string backward (2/6)"
|
|
|
|
gdb_test "x/-sw" "U\"\"" \
|
|
|
|
"take 1 string backward (3/6)"
|
|
|
|
gdb_test "x/-sw" "U\"\"" \
|
|
|
|
"take 1 string backward (4/6)"
|
|
|
|
gdb_test "x/-sw" "U\"GHIJKLMNOPQRSTUVWXYZ\"" \
|
|
|
|
"take 1 string backward (5/6)"
|
|
|
|
gdb_test "x/-sw" "U\"ABCDEFGHIJKLMNOPQRST\"\.\.\." \
|
|
|
|
"take 1 string backward (6/6)"
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "char-width=2, print-max=0" {
|
|
|
|
gdb_test_no_output "set print elements 0"
|
|
|
|
gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\\\\x307b\\\\x3052\\\\x307b\\\\x3052\""
|
|
|
|
"u\"012345678901234567890123456789\""
|
|
|
|
"u\"!!!!!!\""
|
|
|
|
}
|
|
|
|
gdb_test "x/-4xh" "0x0021\[\t \]+0x0021\[\t \]+0x0021\[\t \]+0x0000" \
|
|
|
|
"take 4 characters backward"
|
|
|
|
gdb_test_sequence "x/-6sh" "take 6 strings backward" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"[^\"]+\""
|
|
|
|
"u\"012345678901234567890123456789\""
|
|
|
|
"u\"!!!!!!\""
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward again" {
|
|
|
|
"u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\""
|
|
|
|
"u\"\\\\x307b\\\\x3052\\\\x307b\\\\x3052\""
|
|
|
|
"u\"012345678901234567890123456789\""
|
|
|
|
"u\"!!!!!!\""
|
|
|
|
}
|
|
|
|
gdb_test "x/-xh" "0x0000" "take 1 char backward"
|
|
|
|
gdb_test "x/-sh" "u\"!!!!!!\"" \
|
|
|
|
"take 1 string backward (1/6)"
|
|
|
|
gdb_test "x/-sh" "u\"012345678901234567890123456789\"" \
|
|
|
|
"take 1 string backward (2/6)"
|
|
|
|
gdb_test "x/-sh" "u\".+\"" \
|
|
|
|
"take 1 string backward (3/6)"
|
|
|
|
gdb_test "x/-sh" "u\"\"" \
|
|
|
|
"take 1 string backward (4/6)"
|
|
|
|
gdb_test "x/-sh" "u\"\"" \
|
|
|
|
"take 1 string backward (5/6)"
|
|
|
|
gdb_test "x/-sh" "u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"" \
|
|
|
|
"take 1 string backward (6/6)"
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "char-width=1, print-max=4" {
|
|
|
|
gdb_test_no_output "set print elements 4"
|
|
|
|
gdb_test_sequence "x/9s &TestStrings" "take 9 strings forward" {
|
|
|
|
"\"ABCD\"\.\.\."
|
|
|
|
"\"EFGH\"\.\.\."
|
|
|
|
"\"IJKL\"\.\.\."
|
|
|
|
"\"MNOP\"\.\.\."
|
|
|
|
"\"QRST\"\.\.\."
|
|
|
|
"\"UVWX\"\.\.\."
|
|
|
|
"\"YZ\""
|
|
|
|
"\"\""
|
|
|
|
"\"\""
|
|
|
|
}
|
|
|
|
gdb_test "x/-xb" "0x00" "take 1 byte backward"
|
|
|
|
gdb_test_sequence "x/-4s" "take 4 strings backward (1/2)" {
|
|
|
|
"\"TUVW\"\.\.\."
|
|
|
|
"\"XYZ\""
|
|
|
|
"\"\""
|
|
|
|
"\"\""
|
|
|
|
}
|
|
|
|
gdb_test_sequence "x/-4s" "take 4 strings backward (2/2)" {
|
|
|
|
"\"CDEF\"\.\.\."
|
|
|
|
"\"GHIJ\"\.\.\."
|
|
|
|
"\"KLMN\"\.\.\."
|
|
|
|
"\"OPQR\"\.\.\."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
with_test_prefix "backward disassemble general" {
|
|
|
|
set length_to_examine {1 2 3 4 10}
|
|
|
|
set disassmbly {}
|
|
|
|
|
|
|
|
gdb_test "x/i main" "0x\[0-9a-fA-F\]+ <main>:\t.*" \
|
|
|
|
"move the current position to main (x/i)"
|
|
|
|
gdb_test "x/-i" "0x\[0-9a-fA-F\]+ <main>:\t.*" \
|
|
|
|
"move the current position to main (x/-i)"
|
|
|
|
for {set i 0} {$i < [llength $length_to_examine]} {incr i} {
|
|
|
|
set len [lindex $length_to_examine $i]
|
|
|
|
set instructions [capture_command_output "x/${len}i" ""]
|
|
|
|
lappend disassmbly $instructions
|
|
|
|
}
|
|
|
|
for {set i 0} {$i < [llength $length_to_examine]} {incr i} {
|
|
|
|
set idx [expr [llength $length_to_examine] - $i - 1]
|
|
|
|
set len [lindex $length_to_examine $idx]
|
|
|
|
set actual [capture_command_output "x/-${len}i" ""]
|
|
|
|
set expected [lindex $disassmbly $idx]
|
|
|
|
if {$actual == $expected} {
|
|
|
|
pass "inst:$idx"
|
|
|
|
} else {
|
|
|
|
fail "inst:$idx"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|