如何查看Zig语言程序的汇编输出?
查看Zig程序带行号映射的汇编输出
Zig版本
0.11.0-dev.3299+34865d693
问题描述
希望查看程序的汇编输出,且汇编指令能映射到对应的文件名和行号,方便快速定位其来源。
项目文件
build.zig
const std = @import("std"); pub fn build(b: *std.Build.Builder) !void { // 确定编译目标 const target = b.standardTargetOptions(.{}); // 设置优化选项 const optimize = b.standardOptimizeOption(.{}); // 创建示例可执行文件 const exe = b.addExecutable(.{ .name = "app", .root_source_file = .{ .path = "main.zig" }, .target = target, .optimize = optimize, }); // 执行"zig build"时将可执行文件安装到指定目录 b.installArtifact(exe); }
main.zig
const std = @import("std"); pub fn main() void { std.debug.print("Hello, {s}!\n", .{"World"}); }
解决方法
以下几种方式可以生成带行号映射的汇编输出:
直接用
zig build-exe生成汇编
使用-S参数生成汇编文件,搭配-g参数保留调试信息(包含行号映射):zig build-exe main.zig -S -g执行后会生成
main.s文件,汇编指令旁会带有# main.zig:X这样的标记,对应源码的行号位置。通过build.zig配置生成汇编
修改build.zig,添加专门的汇编生成步骤:const std = @import("std"); pub fn build(b: *std.Build.Builder) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const exe = b.addExecutable(.{ .name = "app", .root_source_file = .{ .path = "main.zig" }, .target = target, .optimize = optimize, }); // 添加生成汇编的步骤 const asm_step = b.addAssembly(.{ .source_file = exe.root_source_file, .target = target, .optimize = optimize, .flags = &.{"-g"}, // 保留调试信息以映射行号 }); b.getInstallStep().dependOn(&asm_step.step); b.installArtifact(exe); }执行
zig build后,汇编文件会生成在zig-out/bin/app.s路径下(具体路径可能因目标平台和优化选项略有差异)。用
zig objdump查看已有二进制的汇编
如果已经编译出二进制文件,使用zig objdump加-S参数,可混合显示汇编指令与对应源码:zig objdump -S zig-out/bin/app终端会输出穿插着Zig源码行的汇编内容,方便直接对照查看。
内容的提问来源于stack exchange,提问作者SilbinaryWolf
相关产品推荐
相关产品推荐

