Comandos para a depuração da memória
Nota
Pesquisa é quando se deseja levantar mais informações sobre algo desconhecido. Busca é quando se deseja levantar informações sobre algo que já se sabe.
dasm
dasm <nome_do_arquivo>,<endereço>,<comprimento>[,<opcodes>[,<CPU>]]
Desmonta a memória do programa num arquivo definido pelo parâmetro <nome_do_arquivo>. O parâmetro <endereço> determina o endereço para o início da desmontagem, o parâmetro <comprimento> determina o quanto da memória será desmontada. A faixa do <endereço> através de <endereço>+<comprimento> inclusive, será desmontada num arquivo. É predefinido que os dados brutos do opcode sejam gerados em cada linha. O parâmetro opcional <opcodes> é um booleano que ativa ou desativa essa funcionalidade. Também é predefinido que a memória do programa seja desmontada na CPU que estiver visível. Defina o 5º parâmetro para desmontar a memória do programa numa CPU diferente (consulte Determinando os dispositivos e as faixas de endereço para obter mais detalhes).
Exemplos:
dasm venture.asm,0,100000-ffff na CPU que estiver visível, incluindo os dados opcode bruto no arquivo venture.asm.dasm harddriv.asm,3000,1000,0,23000-3fff na 3ª CPU do sistema (num índice com base zero), sem os dados opcode bruto no arquivo harddriv.asm.Retorna para Comandos para a depuração da memória.
find
f[ind][{d|i|o}] <endereço>[:<faixa>],<comprimento>[,<dados>[,…]]
f[ind] <endereço>:<memória>.{m|s},<comprimento>[,<dados>[,…]]
Faz uma busca na memória por uma determinada sequência de dados. O
<endereço> determina o início da busca, opcionalmente por ser seguido
por um dispositivo ou uma faixa de endereços (consulte Determinando os dispositivos e as faixas de endereço
para obter mais detalhes). A <faixa> determina o quanto da memória
será buscada. Quando nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do endereço. É predefinido que o comando find exiba a
primeira faixa de endereços que for exposta pelo dispositivo, findd retorna para a faixa do índice 1
(dados), findi retorna para a faixa do índice 2 (E/S), já findo retorna para a faixa do índice 3 (opcodes).
No parâmetro <dados> pode ser usado uma string, um valor numérico,
uma expressão ou um caractere curinga ?. É predefinido que os dados
não string sejam escritos usando o tamanho nativo da palavra na faixa
do endereço. Para substituir o tamanho dos dados para dados não
string, você pode prefixar os valores com b. para impor a busca
com um tamanho de byte, com w. para fazer a busca com o tamanho da
palavra (word), com d. para palavra dupla (double word) e q.
para palavra quádrupla (quadruple word). As sobreposições se propagam
para os valores subsequentes, assim sendo, caso queira fazer uma busca
por uma sequência de palavras, é preciso prefixar o primeiro valor com
w.. Observe também que é possível misturar os tamanhos para realizar
buscas mais complexas.
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1 inclusive, será buscado pela sequência e todas as ocorrências serão exibidas.
Exemplos:
find 0,10000,"HIGH SCORE",00-ffff do programa da CPU que estiver visível seguido pelo byte 0.find 300:tms9918a,100,w.abcd,4567abcd e seguido pelo o valor 4567 na faixa do endereço 300-3fff no primeiro espaço do endereço que estiver exposto pelo dispositivo com o caminho absoluto da etiqueta :tms9918a.find 0,8000,"AAR",d.0,"BEN",w.00000-7fff seguido por uma palavra dupla (double word) 0 e pelos caracteres "BEM" com tamanho 0.Retorna para Comandos para a depuração da memória.
fill
fill[{d|i|o}] <endereço>[:<faixa>],<comprimento>[,<dados>[,…]]
fill <endereço>:<memória>.{m|s},<comprimento>[,<dados>[,…]]
Sobrescreve um bloco da memória com uma cópia da sequência de dados que foi fornecida.
O <endereço> determina o início de onde a escrita deve começar,
opcionalmente por ser seguido por um dispositivo ou uma faixa de endereços
(consulte Determinando os dispositivos e as faixas de endereço para obter mais detalhes). A
<faixa> determina o quanto da memória deve ser preenchida. Quando
nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do
endereço. É predefinido que o comando fill exiba a primeira faixa de endereços
que for exposta pelo dispositivo, filld retorna para a faixa do índice 1 (dados), filli
retorna para a faixa do índice 2 (E/S), já fillo retorna para a faixa do índice 3 (opcodes).
No parâmetro <dados> pode ser usado uma string, um valor numérico,
uma expressão ou um caractere curinga ?. É predefinido que os dados
não string sejam escritos usando o tamanho nativo da palavra na faixa
do endereço. Para substituir o tamanho dos dados para dados não
string, você pode prefixar os valores com b. para impor o
preenchimento com um tamanho de byte, com w. para fazer o
preenchimento com o tamanho da palavra (word), com d. para
palavra dupla (double word) e q. para palavra quádrupla
(quadruple word). As sobreposições se propagam para os valores
subsequentes, assim sendo, caso queira fazer um preenchimento por uma
sequência de palavras, é preciso prefixar o primeiro valor com w..
Observe também que é possível misturar os tamanhos para realizar
preenchimentos mais complexos. A operação de preenchimento poderá ser
truncada caso ocorra um erro falha da página (page fault) ou caso uma
parte da sequência ou da string falhe além do
<endereço>+<comprimento>-1.
Retorna para Comandos para a depuração da memória.
dump
dump[{d|i|o}] <nome_do_arquivo>,<endereço>[:<faixa>],<comprimento>[,<grupo>[,<ascii>[,<tamanho_da_linha>]]]
dump <nome_do_arquivo>,<endereço>:<memória>.{m|s},<comprimento>[,<grupo>[,<ascii>[,<tamanho_da_linha>]]]
Faz o despejo do conteúdo da memória num arquivo texto definido pelo parâmetro <nome_do_arquivo>.
O <endereço> determina o início de onde o despejo deve começar,
opcionalmente por ser seguido por um dispositivo ou uma faixa de endereços
(consulte Determinando os dispositivos e as faixas de endereço para obter mais detalhes). A
<faixa> determina o quanto da memória deve ser despejada. Quando
nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do
endereço. É predefinido que o comando dump exiba a primeira faixa de endereços
que for exposta pelo dispositivo, dumpd retorna para a faixa do índice 1 (dados), dumpi
retorna para a faixa do índice 2 (E/S), já dumpo retorna para a faixa do índice 3 (opcodes).
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1
inclusive, será despejado no arquivo. É predefinido que os dados sejam
produzidos usando o tamanho nativo da palavra na faixa do endereço. É
possível alterar esta funcionalidade ao definir o parâmetro <group>
que pode ser utilizado para agrupar os dados em pedaços de 1-,
2-, 4-, 8 bytes. O parâmetro opcional <ASCII> é um
booleano que ativa ou desativa a geração dos caracteres ASCII do lado
direito de cada linha (a predefinição é enabled). Já o parâmetro
opcional <tamanho_da_linha> determina a quantidade de dados nas
unidades de endereço de cada linha (é predefinido que seja 16 bytes).
Exemplos:
dump venture.dmp,0,100000-ffff em pedaços de 1-byte na região visível do programa na CPU incluindo dados ASCII no arquivo venture.dmp.dumpd harddriv.dmp,3000:3,1000,4,03000-3fff em pedaços de 4-bytes a partir da 4ª CPU do sistema (num índice com base zero) no arquivo harddriv.dmp.dump vram.dmp,0:sms_vdp:videoram,4000,1,false,80000-3fff da videoram em pedaços de 1-byte a partir do dispositivo com o caminho absoluto da etiqueta :sms_vdp, sem dados ASCII, com 8 bytes por linha no arquivo vram.dmp.Retorna para Comandos para a depuração da memória.
strdump
strdump[{d|i|o}] <nome_do_arquivo>,<endereço>[:<faixa>],<comprimento>[,<term>]
strdump <nome_do_arquivo>,<endereço>:<memória>.{m|s},<comprimento>[,<term>]
Faz o despejo do conteúdo da memória num arquivo texto definido pelo parâmetro <nome_do_arquivo>.
O <endereço> determina o início de onde o despejo deve começar,
opcionalmente por ser seguido por um dispositivo ou uma faixa de endereços
(consulte Determinando os dispositivos e as faixas de endereço para obter mais detalhes). A
<faixa> determina o quanto da memória deve ser despejada. Quando
nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do
endereço. É predefinido que o comando strdump retorne para a
primeira faixa de endereços que for exposta pelo dispositivo, strdumpd retorna para a faixa do índice 1
(dados), strdumpi retorna para a faixa do índice 2 (E/S), já strdumpo retorna para a faixa do índice 3
(opcodes).
É predefinido que os dados sejam interpretados como uma série de
caracteres com uma terminação NULA (ASCIIZ), o despejo terá um caractere
por linha, com sequências de escape em estilo C que serão utilizadas
nos bytes que não representem caracteres ASCII imprimíveis. O parâmetro
opcional <term> pode ser usado para especificar um caractere
terminador de string diferente. Se <term> for igual a -0x80, as
strings serão tratadas como terminado após qualquer byte com o bit mais
significativo definido, e o bit mais significativo será ignorado ao
imprimir caracteres.
Retorna para Comandos para a depuração da memória.
save
save[{d|i|o}] <nome_do_arquivo>,<endereço>[:<faixa>],<comprimento>
save <nome_do_arquivo>,<endereço>:<memória>.{m|s},<comprimento>
Grava os dados brutos da memória num arquivo binário determinado pelo parâmetro <nome_do_arquivo>.
O <endereço> determina o início de onde a gravação deve começar,
opcionalmente por ser seguido por um dispositivo ou uma faixa de endereços
(consulte Determinando os dispositivos e as faixas de endereço para obter mais detalhes). A
<faixa> determina o quanto da memória deve ser gravada. Quando
nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do
endereço. É predefinido que o comando save retorne para a primeira
faixa de endereços que for exposta pelo dispositivo, saved retorna para a faixa do índice 1 (dados),
savei retorna para a faixa do índice 2 (E/S), já saveo retorna para a faixa do índice 3 (opcodes).
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1 inclusive, será gravado num arquivo.
Alternativamente, use a sintaxe save:
save <nome_do_arquivo>,<endereço>:<região>.m,<comprimento>
Exemplos:
save venture.bin,0,100000-ffff na região visível do programa na CPU atual em formato binário no arquivo venture.bin.saved harddriv.bin,3000:3,10003000-3fff a partir da 4ª CPU do sistema (num índice com base zero) no arquivo harddriv.bin.save vram.bin,0:sms_vdp:videoram,40000000-3fff da videoram a partir do dispositivo com o caminho absoluto da etiqueta :sms_vdp em formato binário no arquivo vram.bin.Retorna para Comandos para a depuração da memória.
saver
saver <nome_do_arquivo>,<endereço>,<comprimento>,<região>
Grava o conteúdo bruto de uma região da memória determinado pelo parâmetro <região> num arquivo binário determinado pelo parâmetro <nome_do_arquivo>. As etiquetas da região seguem as mesmas regras que as etiquetas dos dispositivos (consulte Determinando os dispositivos e as faixas de endereço para obter mais informações). O <endereço> determina o início de onde a gravação deve começar. O <comprimento> determina o quanto da memória deve ser gravada.
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1 inclusive, será gravado num arquivo.
Exemplos:
saver data.bin,200,100,:monitor200-2ff do :monitor em formato binário no arquivo data.bin.saver cpurom.bin,1000,400,.1000-13ff na região visível do programa na CPU em formato binário no arquivo cpurom.bin.Retorna para Comandos para a depuração da memória.
load
load[{d|i|o}] <nome_do_arquivo>,<endereço>[:<faixa>][,<comprimento>]
load <nome_do_arquivo>,<endereço>:<memória>.{m|s}[,<comprimento>]
Carrega uma memória em formato bruto a partir de um arquivo binário
determinado pelo parâmetro <nome_do_arquivo>. O <endereço> determina
a partir de onde o arquivo deve ser lido, opcionalmente por ser seguido
por um dispositivo ou uma faixa de endereços (consulte Determinando os dispositivos e as faixas de endereço
para obter mais detalhes). O <comprimento> determina o quanto da
memória deve ser lida. Quando nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do endereço. É predefinido que o comando load
retorne para a primeira faixa de endereços que for exposta pelo dispositivo,
loadd retorna para a faixa do índice 1 (dados), loadi retorna para a faixa do índice 2 (E/S), já loado retorna para a faixa do índice 3
(opcodes).
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1 inclusive, será gravado num arquivo. Quando o parâmetro <comprimento> for omitido, caso seja zero ou caso seja maior que o comprimento total do arquivo, todo o conteúdo do arquivo será lido e nada mais.
Observe que isso tem o mesmo efeito que fazer a escrita na faixa do
endereço a partir do visualizador da memória do depurador ou utilizando
os acessórios da memória b@, w@, d@ ou q@ nas expressões
do depurador. O conteúdo da memória que seja de leitura apenas não será
substituído e a escrita nos endereços de E/S terão efeitos que vão além
das configurações dos valores dos registros.
Exemplos:
load venture.bin,0,100000-ffff na região visível do programa na CPU a partir do arquivo binário venture.bin.loadd harddriv.bin,3000,1000,33000-3fff a partir da 4ª CPU do sistema (num índice com base zero) a partir do arquivo binário harddriv.bin.load vram.bin,0:sms_vdp:videoramvideoram para o dispositivo com o caminho absoluto da etiqueta :sms_vdp iniciando no endereço 0000 com todo o conteúdo binário do arquivo vram.bin.Retorna para Comandos para a depuração da memória.
loadr
loadr <nome_do_arquivo>,<endereço>,<comprimento>,<região>
Carrega uma memória na região da memória determinado pelo parâmetro <região> a partir de arquivo binário determinado pelo parâmetro <nome_do_arquivo>. As etiquetas da região seguem as mesmas regras que as etiquetas dos dispositivos (consulte Determinando os dispositivos e as faixas de endereço para obter mais informações). O <endereço> determina o início de onde a leitura deve começar. O <comprimento> determina o quanto da memória deve ser carregada.
Toda a faixa do <endereço> através do <endereço>+<comprimento>-1 inclusive, será lido a partir do arquivo. Quando o <comprimento> for zero ou caso seja maior que o comprimento total do arquivo, todo o conteúdo do arquivo será lido e nada mais.
Alternativamente, use a sintaxe load:
load <nome_do_arquivo>,<endereço>:<região>.m[,<comprimento>]
Exemplos:
loadr data.bin,200,100,:monitor200-2ff do :monitor a partir do arquivo binário data.bin.loadr cpurom.bin,1000,400,.1000-13ff na região visível do programa na CPU a partir do arquivo binário cpurom.bin.Retorna para Comandos para a depuração da memória.
map
map[{d|i|o}] <endereço>[:<faixa>]
Faz o mapeamento lógico do endereço da memória no endereço físico
correspondente, assim como informa o nome do manipulador. O endereço
opcionalmente pode ser seguido por dois pontos e um dispositivo ou uma
faixa de endereço (consulte Determinando os dispositivos e as faixas de endereço para obter mais
detalhes). Quando nenhuma faixa de endereços for definida, o sufixo do comando define a faixa do endereço. É predefinido que o comando map retorne para a
primeira faixa de endereços que for exposta pelo dispositivo, mapd retorna para a faixa do índice 1
(dados), mapi retorna para a faixa do índice 2 (E/S), já mapo retorna para a faixa do índice 3 (opcodes).
Exemplos:
map 152d0152d0 na região visível do programa na CPU.map 107:sms_vdp107 na primeira faixa do endereço para o dispositivo com o caminho absoluto da etiqueta :sms_vdp.Retorna para Comandos para a depuração da memória.
memdump
memdump [<nome_do_arquivo>,[<dispositivo>]]
Faz o despejo dos mapas da memória atual num arquivo determinado pelo
parâmetro <nome_do_arquivo> ou memdump.log casa nenhum parâmetro
seja usado. Quando um <dispositivo> foi definido (consulte
Determinando os dispositivos e as faixas de endereço para obter mais detalhes) apenas os mapas da
memória para a parte da árvore enraizada neste dispositivo serão
despejados.
Exemplos:
memdump mylog.logmylog.log.memdumpmemdump.log.memdump audiomaps.log,audiopcb:audiopcb e todos os dispositivos relacionados no arquivo audiomaps.log.memdump mylog.log,1mylog.log.Retorna para Comandos para a depuração da memória.