我有2个站,一个用于开发,另一个用于测试.我希望能够在测试站上运行和调试在发布模式下构建的目标(代码被剥离).
由于安全原因可能无法将代码复制到测试站,因此我尝试了远程调试,如以下链接所述 - http://lldb.llvm.org/remote.html.
由于调试的两端都运行OS X,因此设置指令指定我的本地(开发)站应该运行'lldb-server'和'debugserver',而远程(测试)端应该运行'platform'.
不幸的是,我在Xcode包中找不到所有这些工具.我也尝试下载lldb源代码并自己创建那些可执行文件,但我仍然缺少lldb-server目标.
我希望我有一些关于如何从A到Z正确进行lldb远程调试的清晰而全面的指南.
我想找到如何以编程方式提取我的计算机名称,类似于以下终端命令的输出scutil --get ComputerName。该值也可以在“关于本机”->“系统软件概述”下找到,如下图所示:
所以我发现一种方法是使用 NSHost,但它早已被弃用:
[[NSHost currentHost] localizedName]
Run Code Online (Sandbox Code Playgroud)
在 NSHost.h 中它提到了在哪里寻找..
请改用网络框架,请参阅 <Foundation/NSHost.h> 中的弃用通知
所以我查看了那里并发现nw_endpoint_get_hostname但它没有关于如何用于获取本地主机名的正确文档。
任何想法如何以编程方式获取此数据(swift/objective-c/c++)
在 OS-X 下,我有一个名为“listener”的进程正在等待“accept”从名为 listener_socket 的本地 unix 套接字读取数据。不幸的是,任何连接该套接字的尝试都以“连接被拒绝”错误终止。
使用 lsof,以确保“侦听器”实际侦听此套接字:
sudo lsof -p 570
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
listener 570 root 3u unix 0x48a2751a1bad61ef 0t0 /private/var/run/my_sockets/listener_socket
Run Code Online (Sandbox Code Playgroud)
请注意,该文件实际上是一个有效的 unix 套接字:
file /private/var/run/my_sockets/listener_socket /private/var/run/my_sockets/listener_socket: socket
Run Code Online (Sandbox Code Playgroud)
但是,它仍然无法连接,即使我使用的是来自命令的替代方式(使用 socat 命令)
sudo socat LOCAL:/private/var/run/my_sockets/listener_socket,interval=1 EXEC:'aaaaaaaaaaaaaaaaa',nofork
2015/11/23 00:57:33 socat[928] E connect(3, LEN=49 AF=1 "/private/var/run/my_sockets/listener_socket", 49): Connection refused
Run Code Online (Sandbox Code Playgroud)
也许我可以做更多的事情来弄清楚为什么我不能将数据发送到套接字,尽管很明显“侦听器”在另一端等待此数据?
这是我的代码的相关部分:
发件人:
sockfd = socket(PF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, "%s", LISTENER_SOCKET_PATH);
connect(sockfd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)
write ... …Run Code Online (Sandbox Code Playgroud) 在/usr/include/openssl/sha.h中声明的SHA256_XXX系列已在OS-X 10.7及更高版本中弃用.
int SHA256_Init(SHA256_CTX *c) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
int SHA256_Final(unsigned char *md, SHA256_CTX *c) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
void SHA256_Transform(SHA256_CTX *c, const unsigned char *data) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
Run Code Online (Sandbox Code Playgroud)
虽然它目前正在运行,但我想知道后续OS X版本的替代方案是什么.
我想将内存分析器添加到在 macOS 下运行的守护进程。在linux中,我可以简单地检查/proc/<pid>/map进程中的任何映射内存,并查找pathname = [heap]或pathname = [stack]。
是否有任何替代的 mac syscall/MIG/mach 消息用于此目的?
我试图查看是否proc_pidinfo包含任何有价值的信息,但不幸的是没有任何与我的需求相关的信息。
请注意,苹果为调用的其他远程进程提供了这样的工具vmmap,但它根本不提供任何 api(它只是命令行工具),并且没有满足此需求的公共 API,但也许有一个 API 可以从“内部”提取此信息“这个过程本身。
基于c ++的运行进程是否可以使用重新加载基于c ++的动态库dlopen.
正在运行的进程将轮询新版本的动态库(使用相同的API).一旦检测到此类文件,就会发生以下一系列操作:
dlclose dlopendlsym新加载的库设置函数指针变量.在最后一个阶段,我实际上获得了所需的API并将其放在我的主代码中的函数指针中,以便稍后使用.
但是,似乎我的程序在第三阶段后意外地崩溃了.是否可能该dlclose部分在流程虚拟空间中留下旧库的一些残余?有没有更好的方法呢?
顺便说一句,在Windows中它使用LoadLibrary, FreeLibrary and GetProcAddress而不是使用dlopen, dlclose and dlsym.
我有以下方法获取C样式结构的向量并一次处理其元素.
我希望扩展它以接收更多类型的结构而不重复我的代码.
由于所有类型的结构都包含相同的字段名称,因此使用模板实现此新要求将是最优雅的.
但是,我无法决定如何将第二个参数传递给write_db函数; 这个参数是每个结构类型的枚举 - 是否有任何选项可以在运行时获取它?
enum policy_types {
POLICY_TYPE_A,
POLICY_TYPE_B,
...
};
// old implementation - suitable for single struct only
int policyMgr::write_rule(std::vector <struct policy_type_a> & list) {
//conduct boring pre-write check
//...
for (auto & item : list ) {
int ret = write_db(item.key1, POLICY_TYPE_A_ENUM, &item.blob);
}
//new implementation - suitable for multiple structs.
template <POLICY>
int policyMgr::write_rule(std::vector <POLICY> & list) {
for (auto & item : list ) {
int ret = write_db(item.key1, type(POLICY) …Run Code Online (Sandbox Code Playgroud) 我在这里阅读了以下文章,解释了如何从纯C代码调用基于c ++的函数.
使用以下示例可以最好地解释该方法:
// C++ code:
class C {
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
Run Code Online (Sandbox Code Playgroud)
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解我在哪里定义了一个由'p'指向的实例.请注意,在C代码中,它作为指向opaque结构的指针传递,并且在C++代码中,它被假定为指向有效实例的指针class C,但是我没有看到这个指针被初始化的位置.
ps当然,使用适当的编译器编译与不同语言相关的每个代码块,并创建不同的目标文件.
我遇到过跨平台代码在基本赋值语句上表现不同的情况。
一个编译器首先评估左值,然后评估右值,然后评估赋值。
另一个编译器首先执行右值,然后执行左值,然后进行赋值。
如果左值影响右值的值,这可能会产生影响,如下例所示:
struct MM {
int m;
}
int helper (struct MM** ppmm ) {
(*ppmm) = (struct MM *) malloc (sizeof (struct MM));
(*ppmm)->m = 1000;
return 100;
}
int main() {
struct MM mm = {500};
struct MM* pmm = &mm
pmm->m = helper(&pmm);
printf(" %d %d " , mm.m , pmm->m);
}
Run Code Online (Sandbox Code Playgroud)
上面的示例中的行pmm->m = helper(&mm);取决于求值的顺序。如果先计算 Lvalue,则 pmm->m 相当于 mm.m,如果先计算 Rvalue,然后 pmm->m 相当于在堆上分配的 MM 实例。
我的问题是是否有一个 C 标准来确定求值的顺序(没有找到),或者每个编译器都可以选择要做什么。我还应该注意其他类似的陷阱吗?
我正在使用IOKit框架IOConnectCallMethod从用户空间客户端和IOExternalMethodDispatch驱动程序端使用我的驱动程序进行通信.
到目前为止,我能够发送固定长度的命令,现在我希望发送一个不同大小的字符数组(即完整路径).
但是,似乎驱动程序和客户端命令长度是耦合的,这意味着checkStructureInputSize来自IOExternalMethodDispatch驱动程序必须等于inputStructCnt来自
IOConnectCallMethod客户端.
以下是双方的结构内容:
驱动程序:
struct IOExternalMethodDispatch
{
IOExternalMethodAction function;
uint32_t checkScalarInputCount;
uint32_t checkStructureInputSize;
uint32_t checkScalarOutputCount;
uint32_t checkStructureOutputSize;
};
Run Code Online (Sandbox Code Playgroud)
客户:
kern_return_t IOConnectCallMethod(
mach_port_t connection, // In
uint32_t selector, // In
const uint64_t *input, // In
uint32_t inputCnt, // In
const void *inputStruct, // In
size_t inputStructCnt, // In
uint64_t *output, // Out
uint32_t *outputCnt, // In/Out
void *outputStruct, // Out
size_t *outputStructCnt) // In/Out
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用各种大小的命令的失败:
std::vector<char> rawData; //vector …Run Code Online (Sandbox Code Playgroud) macos ×5
c ×4
c++ ×4
objective-c ×2
compilation ×1
debugging ×1
dlopen ×1
heap-memory ×1
hostname ×1
lldb ×1
sockets ×1
struct ×1
swift ×1
templates ×1
unix-socket ×1