尝试在程序集程序中打印变量时,GDB显示错误消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试在程序集程序中打印变量时,GDB显示错误消息相关的知识,希望对你有一定的参考价值。

从书中学习汇编语言时,有一个列表显示了一些基本操作:

segment .data
a   dq  176
b   dq  4097

segment .text
global _start

_start:
    mov rax, [a]    ; Move a into rax.
    add rax, [b]    ; add b o rax.
    xor rax, rax
    ret

在使用"$yasm -f elf64 -g dwarf2 -l listing.lst listing.asm"命令组装并与"$ld -o listing listing.o"链接后,我在gdb中运行了该程序。每当我尝试打印变量的值时,gdb都会显示以下错误消息:

(gdb) p a
'a' has unknown type; cast it to its declared type

对于另一个变量'b'也是如此。但是为int工作时,为'a'或'b'强制转换:

(gdb) p (int)a
$11 = 176
(gdb) p (int)b
$12 = 4097

但这不应该没有铸造吗?我为什么需要演员?我在源文件中犯了什么错误?

答案

但这不应该没有铸造吗?

不.GDB告诉你,它不知道ab是什么类型。

我在源文件中犯了什么错误?

你没有犯任何错误,但你也没有提供GDB可以使用的任何调试信息。

您可能希望yasm -g dwarf2 ...这样做,但它只创建描述源的最小调试信息,没有别的:

$ readelf -wi listing.o

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0x37 (32-bit)
   Version:       2
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_stmt_list   : 0x0
    <10>   DW_AT_low_pc      : 0x0
    <18>   DW_AT_high_pc     : 0x14
    <20>   DW_AT_name        : listing.asm
    <28>   DW_AT_comp_dir    : /tmp/
    <2e>   DW_AT_producer    : yasm 1.3.0
    <39>   DW_AT_language    : 32769    (MIPS assembler)
另一答案

较旧的GDB用于默认假设符号是int,因为它没有描述大小/类型的调试信息。

这通常会导致比当前行为更混乱,因此它被改变了。例如The value displayed in Kdbg is wrong -- NASM

以上是关于尝试在程序集程序中打印变量时,GDB显示错误消息的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中查看变量时 Gdb 停止

如何在 gdb 中禁用程序集标签打印

GDB 远程调试 - 无法为默认可视化器实例化打印机

未显示错误时调试 GDB 中断

打印C中所有全局和静态变量的值?

gdb可以跟踪内存分配日志