我正在尝试研究如何在Mac OS X上的C++应用程序中存储然后打印当前堆栈.主要问题似乎是在主要可执行文件中给出一个地址时让dladdr返回正确的符号.我怀疑这个问题实际上是一个编译选项,但我不确定.
我已经尝试过来自Darwin/Leopard的回溯代码,但它调用了dladdr并且与我自己的代码调用dladdr有相同的问题.
原帖:目前我用这段代码捕获堆栈:
int BackTrace(Addr *buffer, int max_frames)
{
void **frame = (void **)__builtin_frame_address(0);
void **bp = ( void **)(*frame);
void *ip = frame[1];
int i;
for ( i = 0; bp && ip && i < max_frames; i++ )
{
*(buffer++) = ip;
ip = bp[1];
bp = (void**)(bp[0]);
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.然后打印堆栈我正在使用这样的dladdr:
Dl_info dli;
if (dladdr(Ip, &dli))
{
ptrdiff_t offset;
int c = 0;
if (dli.dli_fname && dli.dli_fbase)
{
offset = (ptrdiff_t)Ip - (ptrdiff_t)dli.dli_fbase;
c …Run Code Online (Sandbox Code Playgroud) 我有一些跨平台的DNS客户端代码,我用它来做端到端SMTP和在Windows上我可以通过查看注册表找到当前的DNS服务器IP地址.在Mac上我可以使用第一个答案中提到的SystemConfiguration框架,但是这样做的确切方法并不是很明显.
例如,SCDynamicStoreCopyDHCPInfo返回一些动态DHCP相关数据,但不返回DNS服务器地址.
我正在vc2008中构建我的应用程序并在机器网络上进行测试.
除了安装Visual Studio 2008之外,还有什么方法可以在另一台机器上运行C++程序的调试版本?(即没有安装vc2008)
安装redist软件包只会为vc2008程序安装发布模式支持DLL.目前它抱怨"此应用程序无法启动,因为应用程序配置不正确.重新安装应用程序可能会解决此问题.",我假设是"我缺少DLL"的代码.