C++ 在OS X c++;

C++ 在OS X c++;,c++,macos,exc-bad-access,C++,Macos,Exc Bad Access,我目前正在尝试从外部进程获取基址 在XCODE中使用C++br> 到目前为止,我得到的是: if (task_info(this->_pmach_port, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS) { this->Read(this->dyld_info.all_image_info_addr, sizeof(dyld_all_image_infos), &

我目前正在尝试从外部进程获取基址 在XCODE中使用C++br> 到目前为止,我得到的是:

 if (task_info(this->_pmach_port, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS)
 {
     this->Read(this->dyld_info.all_image_info_addr, sizeof(dyld_all_image_infos), &this->all_image_infos);
     printf("Got Task info!\nall_image offset: 0x%llx\ninfo array count: %i",this->dyld_info.all_image_info_addr,this->all_image_infos.infoArrayCount);
     printf("Version: %i\n",this->all_image_infos.version);

     for(int i=0;i< this->all_image_infos.infoArrayCount;i++) {
         printf("image: %s %d\n",
                this->all_image_infos.infoArray[i].imageFilePath,
                this->all_image_infos.infoArray[i].imageLoadAddress
                );
      }
 }
我的主要问题是Xcode停在我想要输出模块信息的那一行 有理由:

EXC\U坏访问(代码=EXC\U I368\U GPFLT)

我做错了什么

因为我刚从使用windows上的WINApi函数切换到在mac上编写程序


我希望有人能帮助我

对于结构中的任何指针,都不能直接访问指向的数据。您必须从另一个进程读取它,就像读取
all\u image\u infos
struct一样。
info\u数组
指针存在该问题。其中的
imageFilePath
也是如此。等等


struct dyld\u image\u info*infoArray;
size\u t size=sizeof(*infoArray)*此->所有图像\u infos.infoArrayCount;
infoArray=malloc(大小);
此->读取(此->所有图像\u infos.infoArray,大小,infoArray);
对于(int i=0;iall\u image\u infos.infoArrayCount;i++){
字符路径[path_MAX];
this->Read(infoArray[i].imageFilePath,sizeof(path),path);
路径[sizeof(path)-1]=0;
//或者,您可以使用memchr()查看路径是否以null结尾。如果不是,则打印您拥有的内容并在循环中阅读更多内容。
printf(“图像:%s%d\n”,
路径
infoArray[i].imageLoadAddress
);
}

我认为
imageFilePath
不是以null结尾的字符串。@pqnet但是,我的infoArray也是空的。。是的,所以我需要像读取all_image_infos结构一样读取它。但是怎么做呢?我对信息数组的偏移量是多少?我很困惑..检查我更新的答案。基本上,从另一个进程复制的结构中的任何“指针”都只是从该进程读取的“地址”。好的,谢谢你的回答!无论如何,这不是它应该工作。因为我需要得到模块名和基本地址,所以我的输出有点令人毛骨悚然。嗯,它看起来是这样的:image:\330\345\303\u377 0 image:\330\345\303\u377 0 image:\330\345\303\u377 0 image:\330\345\303\u377 0 image:\330\345\303\u377 0 image:\330\345\303\u377 0 image:\330\345\303\u377 0每次垃圾都是一样的。您确定
Read()
函数工作正常吗?您是否尝试记录
this->all\u image\u infos.infoArray
以查看它是否合理。如
中的注释所述,如果您在dyld在另一个过程中操作它时获得它,它可能是
NULL
。@Kenthomass对necro表示抱歉。我试图使用vm_read读取infoArray,但总是得到一个空数组。我从所有的\u image\u infos->infoArray获取指针地址,但是当使用vm\u read读取它时,我总是得到一个空响应
    Process To open: hl2_osx   
    Got Task info!
    all_image offset: 0x8feb052c
    info array count: 303 Version: 14
struct dyld_image_info *infoArray;
size_t size = sizeof(*infoArray) * this->all_image_infos.infoArrayCount;
infoArray = malloc(size);
this->Read(this->all_image_infos.infoArray, size, infoArray);
for(int i=0;i< this->all_image_infos.infoArrayCount;i++) {
    char path[PATH_MAX];
    this->Read(infoArray[i].imageFilePath, sizeof(path), path);
    path[sizeof(path) - 1] = 0;
    // Alternatively, you could use memchr() to see if path is null-terminated. If not, print what you have and read more, in a loop.
    printf("image: %s %d\n",
           path,
           infoArray[i].imageLoadAddress
           );
}