system-calls 相关问题

程序使用系统调用来从操作系统的内核请求服务。

有一种方法可以拦截和修改特定程序的所有syscall?

这可能是一个奇怪的问题,这可能是不可能的,但是有没有办法拦截特定程序的所有Syscall?我可以完全控制该文件,这意味着我可以扫描和...

回答 1 投票 0





为什么lseek使用偏移量“-2”而不是“-1”来反向读取?

为什么是-2而不是-1?这是代码的一部分,必须将字符串从一个文件反向写入另一个文件。你能帮我理解为什么它是-2而不是-1吗? 而(n>=0){

回答 2 投票 0

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

包含 hci_core.h 文件时出现未知类型错误 `__u8` 和 `baddr_t`

我正在从源代码编译Linux内核。我正在写一个与蓝牙相关的系统调用。我只是边做边学。 内核代码我已经编译过很多次了。我正在使用 hci_core.h。普...

回答 1 投票 0

警告:内置函数“printf”的隐式声明不兼容[默认启用]

我正在使用以下 C 代码: #包括 #包括 #包括 int main() { int文件=0; if((file=open("testfile.txt",O_RDONLY)) < -1) ...

回答 2 投票 0

madvise(addr, size, MADV_DONTNEED) 会导致段错误吗?

madvise(*, *, MADV_DONTNEED) 应该纯粹是建议性的吗?我尝试扫描 /proc/self/maps 并对其调用 madvise(addr, size, MADV_DONTNEED) : #包括 #包括 madvise(*, *, MADV_DONTNEED) 应该纯粹是建议性的吗?我尝试扫描 /proc/self/maps 并致电 madvise(addr, size, MADV_DONTNEED): #include <stdio.h> #include <sys/mman.h> int main(void) { FILE *fp; char line[1024]; fp = fopen("/proc/self/maps", "r"); if (fp == NULL) { perror("Failed to open maps file"); return 1; } while (fgets(line, sizeof(line), fp)) { char addr[32], perms[8], offset[32], dev[32], inode[32], path[256]; unsigned long start, end; path[0] = '\0'; sscanf(line, "%lx-%lx %s %s %s %s %[^\n]", &start, &end, perms, offset, dev, inode, path); int ret = madvise((void*)start, end - start, MADV_DONTNEED); if(ret == 0) printf(" OK\n"); else printf(" Error\n"); fflush(stdout); } fclose(fp); } 但是这会打印: OK OK OK OK Segmentation fault 有没有一种简单的方法来告诉(从 /proc/self/maps、/proc/self/smaps 或其他方式)进程允许在哪些内存段上调用 madvise(*, *, MADV_DONTNEED)? man 2 madvise 说: 这些建议值不会影响应用程序的语义(MADV_DONTNEED 情况除外),但可能会影响其性能。 并且: MADV_DONTNEED 操作成功后,指定区域中的内存访问语义将发生更改:该范围内页面的后续访问将成功,但会导致从底层映射的最新内容重新填充内存内容文件(用于共享文件映射、共享匿名映射和基于 shmem 的技术,例如 System V 共享内存段)或用于匿名私有映射的按需零填充页面。 并且man 3 posix_madvise 说: 相应的 madvise(2) 值 MADV_DONTNEED 具有破坏性语义。 所以不,这不是纯粹的建议,是的,如果你到处盲目这样做,它可能会导致段错误。

回答 1 投票 0

sbrk(0) 也在幕后分配内存吗?当我存储超过 2K 的中断时没有段错误

我正在学习 sbrk、brk、mmap 等如何工作以及它们提供什么。我正在编写这样的非常基本的代码 int main(int argc, char* argv[]) { 无效* f1 = sbrk(0); int* newarr = (int*)f1; 对于(int我...

回答 1 投票 0

我可以复制并更改新 fd 的缓冲区行为而不更改旧 fd 吗?

我想创建一个与stdout关联的新FILE*,使用setvbuf()将其缓冲区行为更改为_IONBF,但我不想更改stdout的行为,因为程序的其他部分

回答 1 投票 0

ARM 内联汇编:退出系统调用并从内存中读取值

问题 我想在 Linux Android 设备上使用内联汇编在 ARM 中执行退出系统调用,并且希望从内存中的某个位置读取退出值。 例子 不给这个前任...

回答 1 投票 0

C 中的 `write` 系统调用写入意外位置

我写了一个简单的C程序。 它需要四个命令行参数:文件名、起始位置、长度和字节值;打开指定文件进行写入,并从指定位置开始,

回答 1 投票 0

汇编中“int 21h”是什么意思?

我是学习汇编语言的新手,我想知道命令 int 21h 是什么意思。例如: 移动啊,01h 21小时内 它应该从用户那里读取密钥。

回答 3 投票 0

以编程方式在运行时检查Linux内核模块是否存在

我正在编写一个C守护进程,它依赖于两个内核模块的存在来完成其工作。该程序不直接使用这些(或任何其他)模块。它只需要它们存在。

回答 3 投票 0

poll()系统调用中POLLIN和POLLPRI的区别

poll()的文档没有详细解释这一点。在轮询 fd 时,什么时候应该使用 POLLIN,什么时候应该使用 POLLPRI?任何见解都会有用。

回答 3 投票 0

Linux 上`unshare`在哪里定义?

我正在尝试使用 unshare 系统调用,但是我无法找到定义它的标头。我试过: #定义_GNU_SOURCE #包括 但没有结果(该功能不是...

回答 3 投票 0

NtTerminateThread 在终止 self 时返回 STATUS_INVALID_HANDLE

您好,我正在尝试使用 NtTerminateThread 终止当前线程。我知道系统调用的函数需要两个参数,即线程句柄和退出状态,但每当我...

回答 1 投票 0

如何从任意 pthread_t 获取线程 ID?

我有一个pthread_t,我想更改它的CPU亲和力。问题是我使用的是 glibc 2.3.2,它没有 pthread_setaffinity_np()。不过没关系,因为 pthread_setaffinity_n...

回答 6 投票 0

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