strace 相关问题

strace是一个Linux / UNIX工具,用于记录和分析用户端进程进行的系统调用。

strace 输出未显示多线程应用程序中的 malloc 和 free 系统调用

我尝试使用以下代码模拟内存泄漏问题,然后调查导致内存泄漏的系统调用。 包括 #包括 #包括 我尝试使用以下代码模拟内存泄漏问题,然后调查导致内存泄漏的系统调用。 include <iostream> #include <thread> #include <chrono> #include <mutex> #include <ctime> class SharedObject { public: std::string currentTime; SharedObject() { // Capture current time as string auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); currentTime = std::ctime(&now); // Convert time to string } void displayTime() { std::cout << "Current Time: " << currentTime; } }; void threadFunction(const std::string& threadName, int totalIterations) { for (int iteration = 1; iteration <= totalIterations; ++iteration) { SharedObject* obj = new SharedObject(); // Create object std::cout << threadName << " created an object at iteration " << iteration << std::endl; obj->displayTime(); // Every 100 iterations, forget to delete the object (simulating memory leak) if (iteration % 2 == 1) { std::cout << threadName << " forgot to delete the object at iteration " << iteration << std::endl; } else { delete obj; // Delete object std::cout << threadName << " deleted the object at iteration " << iteration << std::endl; } // Sleep for 512 milliseconds std::this_thread::sleep_for(std::chrono::milliseconds(512)); } std::cout << threadName << " completed all iterations.\n"; }int main() { const int totalIterations = 100000; // Launch two threads std::thread thread1(threadFunction, "Thread 1", totalIterations); std::thread thread2(threadFunction, "Thread 2", totalIterations); // Wait for threads to finish thread1.join(); thread2.join(); std::cout << "Both threads completed execution.\n"; return 0; } 我已经在Linux soumajit-HP-Pavilion-Desktop-590-p0xxx 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux system中编译并运行了程序 发布我正在尝试使用 malloc 跟踪 free 和 strace 系统调用。 以下是输出 [pid 18031] <... stat resumed> {st_mode=S_IFREG|0644, st_size=312, ...}) = 0 [pid 18032] write(1, "Current Time: Tue Jan 14 23:08:3"..., 39) = 39 [pid 18031] futex(0x7fcf11c08c20, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 18032] write(1, "Thread 2 deleted the object at i"..., 46) = 46 [pid 18031] <... futex resumed> ) = 0 [pid 18032] nanosleep({tv_sec=0, tv_nsec=512000000}, <unfinished ...> [pid 18031] write(1, "Thread 1 created an object at it"..., 45) = 45 [pid 18031] write(1, "Current Time: Tue Jan 14 23:08:3"..., 39) = 39 [pid 18031] write(1, "Thread 1 forgot to delete the ob"..., 55) = 55 [pid 18031] nanosleep({tv_sec=0, tv_nsec=512000000}, <unfinished ...> [pid 18032] <... nanosleep resumed> 0x7fcf10c7ace0) = 0 [pid 18032] stat("/etc/localtime", <unfinished ...> [pid 18031] <... nanosleep resumed> 0x7fcf1147bce0) = 0 [pid 18032] <... stat resumed> {st_mode=S_IFREG|0644, st_size=312, ...}) = 0 [pid 18031] futex(0x7fcf11c08c20, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...> [pid 18032] futex(0x7fcf11c08c20, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 18031] <... futex resumed> ) = -1 EAGAIN (Resource temporarily unavailable) [pid 18032] <... futex resumed> ) = 0 [pid 18031] stat("/etc/localtime", <unfinished ...> [pid 18032] write(1, "Thread 2 created an object at it"..., 45 <unfinished ...> [pid 18031] <... stat resumed> {st_mode=S_IFREG|0644, st_size=312, ...}) = 0 [pid 18032] <... write resumed> ) = 45 [pid 18032] write(1, "Current Time: Tue Jan 14 23:08:3"..., 39 <unfinished ...> [pid 18031] futex(0x7fcf11c08c20, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> [pid 18032] <... write resumed> ) = 39 [pid 18031] <... futex resumed> ) = 0 [pid 18032] write(1, "Thread 2 forgot to delete the ob"..., 55 <unfinished ...> [pid 18031] futex(0x7fcf11c088c0, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...> [pid 18032] <... write resumed> ) = 55 [pid 18032] futex(0x7fcf11c088c0, FUTEX_WAKE_PRIVATE, 1) = 1 [pid 18031] <... futex resumed> ) = 0 [pid 18032] nanosleep({tv_sec=0, tv_nsec=512000000}, <unfinished ...> [pid 18031] futex(0x7fcf11c088c0, FUTEX_WAKE_PRIVATE, 1) = 0 [pid 18031] write(1, "Thread 1 created an object at it"..., 45) = 45 [pid 18031] write(1, "Current Time: Tue Jan 14 23:08:3"..., 39) = 39 [pid 18031] write(1, "Thread 1 deleted the object at i"..., 46) = 46 [pid 18031] nanosleep({tv_sec=0, tv_nsec=512000000}, 为什么 strace 输出中没有捕获内存分配和取消分配调用? strace是“系统调用/信号跟踪”的缩写。有一些与内存管理相关的系统调用 (sbrk/brk/mmap),但这些都是低级的,对于调试内存泄漏问题没有用处。 如果你想跟踪内存泄漏,你可以使用 g++/clang++ 中提供的类似 AddressSanitizer 的东西: $ g++ -fsanitize=address -g -o code code.cc $ ./code ... Thread 2 completed all iterations. Thread 1 completed all iterations. Both threads completed execution. ================================================================= ==1153114==ERROR: LeakSanitizer: detected memory leaks Direct leak of 320 byte(s) in 10 object(s) allocated from: #0 0x75f22d59e548 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:95 #1 0x56ef3081f76d in threadFunction(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /tmp/x.cc:24 #2 0x56ef30822e7a in void std::__invoke_impl<void, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int>(std::__invoke_other, void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*&&, int&&) /usr/include/c++/13/bits/invoke.h:61 #3 0x56ef30822c4b in std::__invoke_result<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int>::type std::__invoke<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int>(void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*&&, int&&) /usr/include/c++/13/bits/invoke.h:96 #4 0x56ef30822b6a in void std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int> >::_M_invoke<0ul, 1ul, 2ul>(std::_Index_tuple<0ul, 1ul, 2ul>) /usr/include/c++/13/bits/std_thread.h:292 #5 0x56ef30822b03 in std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int> >::operator()() /usr/include/c++/13/bits/std_thread.h:299 #6 0x56ef30822ae3 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), char const*, int> > >::_M_run() /usr/include/c++/13/bits/std_thread.h:244 #7 0x75f22d30edb3 (/lib/x86_64-linux-gnu/libstdc++.so.6+0xecdb3) (BuildId: ca77dae775ec87540acd7218fa990c40d1c94ab1) #8 0x75f22d4fea41 in asan_thread_start ../../../../src/libsanitizer/asan/asan_interceptors.cpp:234 #9 0x75f22cf95a93 in start_thread nptl/pthread_create.c:447 (我将迭代次数限制为10) 更多信息这里。

回答 1 投票 0

如何解释进程的top命令内存使用情况?

我想了解作为进程的 top 命令一部分显示的 VIRT、RES 和 SHR 值的重要性。 我编写了一个简单的程序,它本身不分配任何私有内存......

回答 1 投票 0

strace 输出,系统调用参数

我是 Linux 内部的新手 - read 系统调用后的不同整数值意味着什么? 我见过 read(0, read(5, read(6, read(12 )。 它们是文件描述符吗? 第3342章 # 你...

回答 1 投票 0

程序打开特定文件时 gdb 中断

背景故事:在 strace 下运行程序时,我注意到“/dev/urandom”正在被打开。 我想知道这个调用来自哪里(它不是程序本身的一部分,它是......

回答 4 投票 0

查找threading.Lock的futex id

我想要检测一个大型 Python 项目,以便能够调试如下所示的生产问题: 23321 07:49:57.925037 futex(0x23b2c20, FUTEX_WAIT_PRIVATE, 0, 空 233...

回答 2 投票 0

为什么读取后没有调用fstab64?这会是一个问题吗?

我想创建一个新的动态库而不是另一个,它的源代码丢失了。我创建了一个包含导出函数的库,但程序未加载它。结论 Strace 是

回答 1 投票 0

调试使用 strace 运行时生成的核心

我用 strace (strace /my/app) 运行我的程序,它崩溃了,转储了一个核心文件。当我在 gdb 中打开核心时,正在“调试”的可执行文件是 strace,而不是我的应用程序。 我可以加载符号...

回答 1 投票 0

strace 如何连接到已经运行的进程?

我确实知道 strace 使用 ptrace 来完成这项工作, 但它需要在 TRACE_ME 开启的情况下运行目标进程, 这不适用于已经运行的进程的情况。 它如何在 alr 上工作...

回答 2 投票 0

两个同时发送会锁定两个程序

我正在调试我的应用程序(有点像之前问题的后续),它本质上是一个玩具点对点客户端。其工作原理如下: Peer 1 向 Pee 请求一个区块(或多个区块)...

回答 1 投票 0

为使用 ltrace/strace 运行的可执行文件提供命令行参数

标题已经说明一切啦! 如何向要使用 ltrace/strace 监视其执行情况的可执行文件提供命令行参数? 例如,如果可执行文件是“a.out”并且我想要

回答 2 投票 0

使用 strace 调试连接系统调用 – @"sun_path" 是什么意思?

我有两个不同语言的程序试图连接到 Linux 系统上的本地抽象套接字。两者之一失败了。我很难确定原因。我只是想知道

回答 2 投票 0

使用 ptrace 进行系统调用拦截与 strace 输出不同

我正在使用 nix crate 的 ptrace 功能拦截子进程完成的系统调用。原则上,我的代码正在工作,因为它没有崩溃,系统调用被拦截,a...

回答 1 投票 0

如果实际的系统调用是clone(),为什么在strace中接受fork()?

我正在使用以下命令来检查我的程序之一执行期间的系统调用次数: strace -e 跟踪= -c ./program [ARGS] 如果我替换 ...

回答 1 投票 0

如何知道系统调用是否返回错误?

我尝试使用 ptrace 在 C 中重现 strace 行为。 我想检查系统调用是否返回错误(以及错误1),但我不知道该怎么做? 这是 s...

回答 1 投票 0

如何监控Linux中特定进程的所有网络流量?

我想监控并记录特定进程产生的所有流量。 我知道 tcpdump,但它似乎不支持按进程(pid/路径,或至少用户)过滤。 还有其他的吗...

回答 2 投票 0

系统调用的 strace 顺序与预期顺序不匹配

我希望 strace 使用测试代码片段运行,以便按照 dissambly 的建议在打开调用之前输出写入调用。 put 是以某种方式异步执行写入还是 strace

回答 1 投票 0

有没有办法获得从C标准库中的函数一直到系统调用的完整函数调用链?

我使用的是 Ubuntu x86_64 系统。我知道我们有 strace 命令来跟踪程序中的系统调用。不过我想知道是否有办法(除了检查 GNU C 库之外)...

回答 2 投票 0

strace 输出实际的系统调用名称还是执行它们的包装函数的名称?

只是要求确认 strace 输出是系统调用的名称,而不是执行这些实际系统调用的包装函数的名称

回答 1 投票 0

strace 可以调试 gdb 正在调试的应用程序吗?

背景 我正在 WSL(适用于 Linux 的 Windows 子系统)下使用 gdb 8.3 调试 Android 应用程序。调试我的应用程序时,gdb 经常捕获 SIGSEGV 和其他终止

回答 3 投票 0

如何识别 Docker 中的应用程序所需的 Debian 软件包以实现简约设置

我正在使用 Docker,并有一个运行名为“App”的应用程序的容器。我的目标是创建一个更简约的 Docker 容器,其中仅包含必要的 Debian 软件包

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.