英文:
Valgrind illegal hardware instruction with Zig
问题
这是我使用Valgrind调试一个简单的Zig代码泄漏内存时的代码:
const std = @import("std");
const Point = struct {
x: i32,
y: i32,
};
pub fn main() !void {
const allocator = std.heap.c_allocator;
const point = try allocator.create(Point);
// defer allocator.destroy(point);
point.* = Point{
.x = 1234,
.y = 5678,
};
std.debug.print("point={}\n", .{point});
}
我使用以下命令编译代码:
zig build-exe leak.zig --library c
然后我使用以下命令运行Valgrind:
valgrind ./leak
这是Valgrind的输出:
==21676== Memcheck, a memory error detector
==21676== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==21676== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info
==21676== Command: ./leak
==21676==
point=leak.Point{ .x = vex amd64->IR: unhandled instruction bytes: 0x62 0xF2 0x7D 0x28 0x7A 0xC6 0xF 0x1F 0x44 0x0
vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE
vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0
==21676== valgrind: Unrecognised instruction at address 0x25ca25.
==21676== at 0x25CA25: memset (in /home/mattia/dev/test-zig/vv/leak)
...
我使用的Zig版本是0.11.0-dev.4006,Valgrind版本是valgrind-3.21.0,运行在Ubuntu 22.04上。
发生这种情况的原因是Valgrind无法处理Zig编译生成的某些指令,这导致Valgrind报告了未识别的指令并终止了程序的执行。要解决这个问题,你可以考虑以下几种方法:
-
更新Zig和Valgrind版本: 确保你正在使用最新版本的Zig和Valgrind,因为新版本可能会修复一些问题。
-
尝试其他工具: 考虑使用其他内存分析工具,例如AddressSanitizer(ASan)或MemorySanitizer(MSan),它们可能与Zig更兼容。
-
禁用Valgrind的某些功能: 你可以尝试通过Valgrind的选项来禁用某些功能,以防止Valgrind报告错误。例如,你可以尝试使用
--smc-check=all
选项来禁用Self-Modifying Code(SMC)检查,但这可能会降低Valgrind的检测能力。
请注意,Valgrind在处理某些特定的编程语言或编译器生成的代码时可能会遇到问题,因此有时需要尝试不同的工具或方法来调试内存泄漏问题。
英文:
I'm trying to debug the memory using Valgrind for a simple Zig code that leaks memory.
This is the code I'm using
const std = @import("std");
const Point = struct {
x: i32,
y: i32,
};
pub fn main() !void {
const allocator = std.heap.c_allocator;
const point = try allocator.create(Point);
// defer allocator.destroy(point);
point.* = Point{
.x = 1234,
.y = 5678,
};
std.debug.print("point={}\n", .{point});
}
I'm compiling the code using
zig build-exe leak.zig --library c
Then I'm running valgrind using
valgrind ./leak
This is the output I got from valgrind
==21676== Memcheck, a memory error detector
==21676== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==21676== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info
==21676== Command: ./leak
==21676==
point=leak.Point{ .x = vex amd64->IR: unhandled instruction bytes: 0x62 0xF2 0x7D 0x28 0x7A 0xC6 0xF 0x1F 0x44 0x0
vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE
vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0
==21676== valgrind: Unrecognised instruction at address 0x25ca25.
==21676== at 0x25CA25: memset (in /home/mattia/dev/test-zig/vv/leak)
==21676== by 0x249C79: fmt.formatInt__anon_7676 (fmt.zig:1418)
==21676== by 0x249BB3: fmt.formatIntValue__anon_7673 (fmt.zig:784)
==21676== by 0x249B63: fmt.formatValue__anon_7672 (fmt.zig:733)
==21676== by 0x243DBA: fmt.formatType__anon_7382 (fmt.zig:487)
==21676== by 0x2382D7: fmt.formatType__anon_7092 (fmt.zig:596)
==21676== by 0x22F46E: fmt.formatType__anon_6492 (fmt.zig:625)
==21676== by 0x22F396: fmt.format__anon_6443 (fmt.zig:184)
==21676== by 0x20C0E0: io.writer.Writer(fs.file.File,error{Unexpected,DiskQuota,FileTooBig,InputOutput,NoSpaceLeft,DeviceBusy,InvalidArgument,AccessDenied,BrokenPipe,SystemResources,OperationAborted,NotOpenForWriting,LockViolation,WouldBlock,ConnectionResetByPeer},(function 'write')).print__anon_4362 (writer.zig:28)
==21676== by 0x20A0BD: debug.print__anon_3012 (debug.zig:90)
==21676== by 0x209E35: leak.main (leak.zig:19)
==21676== by 0x20A673: callMain (start.zig:608)
==21676== by 0x20A673: initEventLoopAndCallMain (start.zig:542)
==21676== by 0x20A673: callMainWithArgs (start.zig:492)
==21676== by 0x20A673: main (start.zig:507)
==21676== Your program just tried to execute an instruction that Valgrind
==21676== did not recognise. There are two possible reasons for this.
==21676== 1. Your program has a bug and erroneously jumped to a non-code
==21676== location. If you are running Memcheck and you just saw a
==21676== warning about a bad jump, it's probably your program's fault.
==21676== 2. The instruction is legitimate but Valgrind doesn't handle it,
==21676== i.e. it's Valgrind's fault. If you think this is the case or
==21676== you are not sure, please let us know and we'll try to fix it.
==21676== Either way, Valgrind will now raise a SIGILL signal which will
==21676== probably kill your program.
I'm using zig version 0.11.0-dev.4006 and valgrind version valgrind-3.21.0 on Ubuntu 22.04.
Why is this happening and how can I run valgrind on zig code?
答案1
得分: 1
这是 vpbroadcastb ymm0,esi
,这是一个AVX512指令,在Valgrind中不支持。尝试在不使用AVX512的情况下编译。
英文:
That’s vpbroadcastb ymm0,esi
which is an avx512 instruction, unsupported by Valgrind. Try compiling without avx512.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论