我正在尝试测试一个 C 程序,该程序打印字符并将转义字符处理到 docker 中的标准输出。我在 kali Linux 虚拟机中运行 docker。这是我的 dockerfile:
FROM archlinux:latest
WORKDIR /Lab3
COPY . .
RUN pacman -Syu --noconfirm && pacman -S --noconfirm base-devel
RUN pacman -S --noconfirm valgrind
RUN chmod +x testscr.sh
CMD ["./testscr.sh"]
当我在 kali 中运行代码时,我最终得到了正常的结果。当我在 docker 中运行它时,valgrind 给了我这个错误:
valgrind: Fatal error at startup: a function redirection
valgrind: which is mandatory for this platform-tool combination
valgrind: cannot be set up. Details of the redirection are:
valgrind:
valgrind: A must-be-redirected function
valgrind: whose name matches the pattern: strlen
valgrind: in an object with soname matching: ld-linux-x86-64.so.2
valgrind: was not found whilst processing
valgrind: symbols from the object with soname: ld-linux-x86-64.so.2
整个项目只是为了试验/学习 docker,我已经知道代码可以工作并且没有内存泄漏。为什么 valgrind 失败?
我尝试重建并确保启用了嵌套虚拟化。没有 valgrind 的程序的输出符合预期。
您提到您正在 Kali Linux 系统上运行 Docker。您的
Dockerfile
使用的是 Arch Linux 基础映像,但您没有提到您特别需要此发行版。使用 Ubuntu 基础镜像尝试一下。
🗎
Dockerfile
FROM ubuntu:22.04
WORKDIR /Lab3
RUN apt-get update -qq && \
apt-get install -y -qq g++ valgrind
# Copy files AFTER pacman install, otherwise cached install not used.
#
COPY . .
RUN chmod +x testscr.sh
CMD ["./testscr.sh"]
🗎
testscr.sh
(我不知道这是什么样子,请在这里猜猜...)
#!/bin/bash
g++ -g -o leaky leaky.cpp
valgrind --leak-check=full ./leaky
🗎
leaky.cpp
(一个存在内存泄漏的简单 C++ 文件。)
#include <iostream>
#include <cstdlib>
// This has a memory leak!
int main() {
int *ptr = new int; // Allocate memory without deallocating it.
*ptr = 10;
std::cout << "Value: " << *ptr << std::endl;
// delete ptr; // Uncomment this line to fix the memory leak
return 0;
}