- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 x86_64 汇编程序,我试图在 Linux 上调试,但是当我尝试使用 gdb
时,它会随机跳过并循环执行相同的指令对或重复指令。它还似乎根据我设置断点的位置循环执行不同的指令。
我试着在线研究这个问题,我看到很多人在使用 C++ 时遇到同样的问题,因为编译器过于积极地优化并生成不正确的调试信息。我没有看到任何关于汇编的信息,但我相信 yasm
也可能是这里的问题。
这是我的 Makefile。
myprog : myprog.o
gcc -static -fdwarf2-cfi-asm myprog.o -o myprog
myprog.o : myprog.asm
yasm -f elf64 -g dwarf2 myprog.asm -o myprog.o
请注意,我是静态链接,因为我无法使动态链接起作用。以后我可能会问一个单独的问题。
这或多或少是 gdb
session 的样子。
...
(gdb)@ n
65 call findrepl
(gdb)@ n
73 mov rdi, str3
(gdb)@ n
75 call findrepl
(gdb)@ n
75 call findrepl
(gdb)@ n
65 call findrepl
...
使用 s
、si
或 ni
都与上面显示的 n
相同。我以前的汇编程序没有遇到过这个问题。有时 gdb
会说我执行了类似 xor eax, eax
的操作,但随后会显示我对 printf
的调用的输出。
我对汇编编程和gdb
比较陌生,所以在我的脑海深处我想知道这是否是我的错。有没有办法来解决这个问题?我还想知道是否有任何解决方法,因为我似乎无法在不使用 gdb
的情况下对其进行调试。
最佳答案
经过反复试验,我发现了 gdb 的“-tui”选项和“layout asm”命令。可能有更好的方法来执行此操作,但基本上您需要输入以下内容才能使其正常工作:
[user@comp ~/prog/]$ gdb -tui myprog
(gdb)@ layout asm
(gdb)@ break main
(gdb)@ run
然后你就可以疯狂了。默认情况下,它被反汇编成 AT&T 表示法。您可以使用 show disassembly-flavor
检查它当前显示的符号。您可以使用 set disassembly-flavor intel
或 set disassembly-flavor att
更改它。
有关详细信息,请在 gdb
中运行 help tui
、help layout
或 help set disassembly-flavor
.
关于linux - 为什么 yasm 生成不正确的调试信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927620/
在 Android 中集成 FFMPEG 库时出现上述错误。以下是屏幕截图。有人可以帮我整合这个库吗?我正在使用 Ubuntu OS 来实现这一点。 最佳答案 只需安装yasm sudo apt-ge
构建将近半小时后,出现以下错误。到目前为止,谷歌搜索没有任何帮助...... In file included from external/chromium_org/third_party/yasm/
我正在尝试通过 brew 安装 ffmpeg。我用 yasm 得到的错误是 “错误:在安装 ffmpeg 之前,您必须‘brew link pkg-config yasm’” 这样做时,我被告知我的权
org 0x7c00是在平面二进制文件中获取正确绝对地址的正常方法,但我对我希望使用的另一种方法感到好奇。 我尝试使用section boot vstart=0x7c00 align=1告诉YASM正
我有一个 x86_64 汇编程序,我试图在 Linux 上调试,但是当我尝试使用 gdb 时,它会随机跳过并循环执行相同的指令对或重复指令。它还似乎根据我设置断点的位置循环执行不同的指令。 我试着在线
我遇到了一个奇怪的问题。我试图安装 x264。当运行 sudo ./configure --enable-shared 时,它给出了: 找不到汇编器最低版本是 yasm-0.7.0如果您真的想在没有
我正在尝试为使用 的英特尔语法编写的 x86_64 汇编源代码64 位寄存器 .我使用以下命令行标志: yasm foo.asm -a x86 -m amd64 我不断收到以下错误: warning:
假设我声明了以下内容: section .bss buffer resb 1 这些说明位于.text部分: mov al, 5 ; mov-i
我想在c代码中调用ASM函数,如何将参数传递给ASM代码? #include extern int * asm_mod_array(int *ptr,int size); int main()
我需要 Microsoft Visual 2015 中的 Windows 10 中的 YASM 软件,谁能告诉安装 yasm 的步骤。 我已经使用了下面的链接。 https://github.com/
我有一个以原始模式读取字符的程序。也就是说,任何输入的字符都会被立即读取,而不是被缓冲。 我想知道如何执行退格。也就是说,当我按下退格键时,它应该删除左边的字符并将光标向左移动一位。 我尝试输出一个退
我有一个以原始模式读取字符的程序。也就是说,任何输入的字符都会被立即读取,而不是被缓冲。 我想知道如何执行退格。也就是说,当我按下退格键时,它应该删除左边的字符并将光标向左移动一位。 我尝试输出一个退
我正在尝试让 libtool 和 yasm 一起工作。 yasm 从我的 .asm 源创建正确的 .o 文件,但我不知道如何获取 libtool 构建相关的 .lo 和 .dep 文件。它想要构建共享
这个问题在这里已经有了答案: Can't run executable linked with libc (1 个回答) 关闭 2 年前。 当尝试在 linux (x86-64) 上从汇编代码 (y
我已经使用 yasm 汇编了代码,并链接到我的 C++ 程序,但我无法在 gdb 中对来自汇编语言文件的符号设置断点。 命令行可能不是很清楚,但我们开始吧: "g++" -ftemplate-dep
我正在尝试在 64 位 Linux 上运行的 NASM 中实现一个数组的选择排序。 数组声明为: section .bss strbuf resb 10 small resb 1 ; curre
我正在尝试使用 yasm 汇编下面的代码。我在 yasm 报告错误“错误:操作数 2 的大小无效”的地方添加了“此处”注释。为什么会发生这个错误? segment .data a db 25
我有一个关于 nasm 及其与 C++ 的链接的问题。我将一个小测试函数声明为 extern "C"void __cdecl myTest( byte i1, byte i2, int stride,
我正在尝试编写一个即时编译器,但我有一段代码不想工作。我的平台是 x86-64 ubuntu。 我在 yasm 中编写了以下代码: bits 64 mov rdx, 1 mov rcx, 'A' mo
我想在 yasm 程序中使用 POSIX 线程(或简称 pthread)库实现并行处理。 代码 这是我程序中最重要的部分。 section .data pThreadID1 dq
我是一名优秀的程序员,十分优秀!