相关疑难解决方法(0)

malloc()和free()如何工作?

我想知道如何malloc和free工作.

int main() {
    unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));
    memset(p,0,4);
    strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**
    cout << p;
    free(p); // Obvious Crash, but I need how it works and why crash.
    cout << p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果答案在记忆水平上是深入的,如果可能的话,我将非常感激.

c c++ malloc free memory-management

263
推荐指数
9
解决办法
14万
查看次数

Linux中的匿名inode是什么?

我做了一个关于"匿名inode"的谷歌搜索,它似乎与epoll有关......但究竟是什么呢?

linux inode epoll

20
推荐指数
2
解决办法
1万
查看次数

/ proc/[pid]/pagemaps和/ proc/[pid]/maps | Linux的

我试图了解标题中提到的两个文件.我抬头看了些什么东西; 但是,我无法理解如何从中提取有用的信息(或者我只是以错误的方式接近它).

让我解释一下:页面映射是一个相当新的"特征"伪文件,它包含分配给当前[pid]的虚拟页面的物理帧信息.也就是说,给定一个从地址x开始的虚拟页面,比如用于虚拟地址开始的'vas',我可以使用vas索引页面映射文件以获得映射的物理页面帧的64位.这些位包含有关该虚拟页面的信息.然而,当我提取位并进行一些移动时,我迷失了我所看到的东西.

这些位表示如下:0-54是页面帧号,55-60是页面移位,第63位是当前位,还有其他位对我不感兴趣.在我使用/ proc/[pid]/maps中的vas地址进行一些映射之后,似乎几乎每个进程的页面都被交换,即第63位始终为零.:(

我想问题是,如何有效地使用页面地图获取/ proc/[pid]/maps给出的地址的等效物理地址

公平地说,我发布了一个类似的问题,但几天前的方法有点不同.

如果有人能够对这个问题有所了解,我将非常感激.

===编辑===

要解决以下评论:我正在从/ proc/[pid]/maps读取一行,其行如下所示:

00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem 7ffffef1b000-7ffffef3c000 rw -p 00000000 00:00 0 [stack]

然后我将提取它接触的虚拟页面的数量并索引二进制文件/ proc/[pid]/pagemaps,并且对于每个虚拟页面,我可以提取它分配给它的物理页面.

输出如下:

00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem num_pages:1:86000000001464C6

虚拟范围中每个虚拟页面的一个物理地址.

读取行和提取物理地址的代码是:

74     /* process /proc/pid/maps, by line*/
75     while(fgets(line, 256, in_map) != NULL){
76         unsigned long vas;
77         unsigned long vae;
78         int num_pages;
79 
80         //print line
81         printf("%s", line);
82 
83         /*scan for the virtual addresses*/
84         n = sscanf(line, "%lX-%lX", &vas, &vae);
85 …
Run Code Online (Sandbox Code Playgroud)

c linux memory-management linux-kernel

13
推荐指数
2
解决办法
8519
查看次数

NDK应用程序签名检查

我在应用程序中有一些安全密钥.我想要安全地存储它.我喜欢将它存储在本机共享库中(可能是从某些代码生成的).之后,我希望它通过一种方法返回,该方法将检查原始APK的签名.所以没有人可以使用此文件,除了可信应用程序.我知道,ndk库也可以反编译,但是对本机代码进行逆向工程甚至比java .class文件更难.

题:

  1. 有没有办法从本机代码(c/c ++)中调用原始apk的签名?
  2. 如何确保从受信任的应用程序调用库?

java security android digital-signature android-ndk

12
推荐指数
2
解决办法
4012
查看次数

升级到Lollipop后,Android NDK mmap呼叫在32位设备上断开

我试图抓住784 MiB的内存.是的,我知道这对32位手机来说很重要,但以下调用在Android 5.0之前有效:

mmap(0, 0x31000000, PROT_NONE, MAP_ANON | MAP_SHARED, -1, 0);
Run Code Online (Sandbox Code Playgroud)

但是,在不同制造商的三种不同设备上,升级到Android 5.0已经打破了这一局面.我假设这是5.0中内存分配功能的一些变化; 也许需要传递不同的标志?

这是logcat中返回的错误消息:

E/libc? mmap fail (pid 9994, tid 10125, size 822083584, flags 0x21, errno 12(Out of memory))
Run Code Online (Sandbox Code Playgroud)

unix memory android mmap android-ndk

10
推荐指数
1
解决办法
2251
查看次数

以编程方式确定在另一个进程中加载​​了哪些模块?(OS X)

我想要做的事情我觉得非常简单,我只是不确定如何做到这一点.

具体来说,我只想获得一个在另一个进程中加载​​的模块列表(共享/动态库).以及获取该模块在给定进程中的起始地址.

通过GDB获取此信息非常简单.您只需连接到该流程,然后键入"info shared".这是我想要的确切信息类型.如:

Num Basename
类型地址原因| | 来源| |
| | | | | |
1 Adium
- 0x1000 exec YY /Applications/Adium.app/Contents/MacOS/Adium(offset 0x0)2 dyld
- 0x8fe00000 dyld YY/usr/lib/dyld,位于0x8fe00000(偏移量0x0),前缀为"__dyld_"3 WebCore F 0x95b6a000 dyld YY /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore位于0x95b6a000(偏移量0x95b6a000)

有没有人知道如何以编程方式执行此操作?显然,模块负载是动态的,所以我需要确定它的位置.

macos xcode gdb objective-c

8
推荐指数
2
解决办法
3206
查看次数

缺少/ proc/pid/maps中的[heap]部分

我正在尝试一个不断分配内存的简单C程序:

for ( i = 0; i < 10000; i ++ )
{
    array[i] = malloc( 1024*1024 );
    if ( array[i] == NULL )
    {
        break;
    }
    printf("Sleeping...%d\n", i);
    sleep( 60 );
}
Run Code Online (Sandbox Code Playgroud)

完整代码粘贴在这里:http://tny.cz/2d9cb3df

但是,当我cat /proc/pid/maps,我没有任何[heap]部分.为什么?

08048000-08049000 r-xp 00000000 08:11 17         /data/a.out
08049000-0804a000 r--p 00000000 08:11 17         /data/a.out
0804a000-0804b000 rw-p 00001000 08:11 17         /data/a.out
0804b000-0805e000 rw-p 00000000 00:00 0 
b74c6000-b75c8000 rw-p 00000000 00:00 0 
b75c8000-b7775000 r-xp 00000000 08:01 3539272    /lib/i386-linux-gnu/libc-2.17.so
b7775000-b7777000 r--p 001ad000 …
Run Code Online (Sandbox Code Playgroud)

c memory

8
推荐指数
1
解决办法
2363
查看次数

android mmap因内存不足而失败

我到处寻找答案,但我想我已经达到了我能找到的极限.我的问题似乎与此有点相关:升级到Lollipop后,32位设备上的Android NDK mmap调用被破坏但没有提供答案.

我的问题是我尝试通过mmap调用从文件中存储映射457232384字节.在Android 5.1.1的两个不同的设备(三星Galaxy Note 3和OnePlus One,每个3GB RAM)上,该调用失败,错误12"内存不足".实际上,当我尝试分配超过300MB的内存时,调用失败.313524224字节(299MB)工作,314572800(300MB)不会.

事情是,同样的调用适用于第四台仍在Android 4.4.2上的设备.更奇怪的是,这个调用适用于带有SDK 21(Android 5.0)的Android ARM模拟器.不用说,可以毫无问题地加载相同数量的数据(不是mmap').

dmesg向我报告:

<3>[ 1137.488411] [0:Thread-298: 4267] arch_get_unmapped_area (TASK_SIZE - len < addr) len=457232384 task size=3204448256 pid=4267 do_align=0 addr=3034054656 mmap_base=3069939712
Run Code Online (Sandbox Code Playgroud)

尝试映射文件的函数(来自openfst)如下:

MappedFile* MappedFile::Map(istream* s, const FstReadOptions &opts,
                        size_t size) {
  size_t pos = s->tellg();

  if (opts.mode == FstReadOptions::MAP && pos >= 0 &&
      pos % kArchAlignment == 0) {
    int fd = open(opts.source.c_str(), O_RDONLY);
    if (fd != -1) {
      int pagesize = getpagesize();
      off_t offset = …
Run Code Online (Sandbox Code Playgroud)

memory android mmap android-ndk

5
推荐指数
1
解决办法
7866
查看次数

确定文件映射到内存的次数

是否可以获取 Linux 中特定文件描述符上的内存映射总量?为了清楚起见,我制作了一个如何打开/创建内存映射的小示例代码:

int fileDescriptor = open(mapname, O_RDWR | O_CREAT | O_EXCL, 0666);
if(fileDescriptor < 0)
    return false;

//Map Semaphore
memorymap = mmap(NULL, sizeof(mapObject), PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
close(fileDescriptor); 
Run Code Online (Sandbox Code Playgroud)

内存映射由多个进程使用。我可以访问将使用此内存映射的其他进程的代码库。如何以 100% 正确的方式获取 fileDescriptor 上有多少个映射?

c++ linux shared-memory

4
推荐指数
1
解决办法
645
查看次数

C++程序立即使用2 GB的RAM:如何找到罪魁祸首?

我有一个程序,在初始化时查询时,立即使用> 2 GB的RAM.基本上代码是这样的:

#include <blah>

int main() {
    cout << get_mem_usage() << endl;
    //Lots of things happen, but no significant memory usage
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量:[2013-02-15 18:38:05.865283] 2147.71 Mb

但是,我链接到许多不同的共享对象文件:我检查了ldd,我链接到58个库,组合的.so大小为66 MB.

我很确定get_mem_usage程序返回正确的值:这些与top和massif输出一致.

我还要提一下,我正在与高能物理分析的ROOT框架联系起来.

我使用的是Linux x86_64,而get_mem_usage()函数是自行开发的.

如果可能的话,我想减少程序的内存使用量.

c++ ram memory-management

1
推荐指数
1
解决办法
411
查看次数

如何识别 /proc/$PID/maps 文件中的 STACK 和 HEAP 段?

我可以识别 /proc/$PID/maps 文件中的 text、ds 和 bss 段(通过猜测或在特定段的访问说明符的帮助下)。但是堆和堆栈段是依次给出的。有没有办法确定哪个段属于堆栈,哪个属于堆?

----- 本例中如何识别堆和栈的分界 ---------- 0a8a0000-0ab2e000 rw-p 0a8a0000 00:00 0 [heap]
< b648e000-b648f000 ---p b648e000 00:00 0
<b648f000-b6496000 RW-p 00:00 b648f000 0
<b6496000-b6497000 --- p b6496000 00:00 0
<b6497000-b649e000 RW-p 00:00 b6497000 0
<b649e000-b649f000 --- p b649e000 00:00 0
< b649f000-b64a6000 rw-p b649f000 00:00 0
< b64a6000-b64a7000 ---p b64a6000 00:00 0
< b64a7000-00600000000-
p60000000000000000000000000004 00:00 0
< b64af000-b657a000 rw-p b64af000 00:00 0
< b657a000-b657b000 ---p b657a000 00:00 0
< b657b000-b065a0p-065000-b065a000
< b65a5000-b65a6000 ---p b65a5000 00:00 …

c linux proc

1
推荐指数
1
解决办法
1万
查看次数