- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 Mac 上使用 clang++(别名为 g++)。
我正在尝试在 C++ 中打印类似 Python 的堆栈跟踪。
我愿意使用框架和/或其他编译器,但我需要它在 mac 或 ubuntu 上运行。
我已经 checkout backtrace ,但它似乎有点原始——我宁愿不必计算字节数来找出堆栈跟踪中每一行所指的源代码中的位置。
此外,如果它是相关的,我真的不需要任何优化,所以如果有帮助,我愿意关闭优化。此外,如果我可以使用 C++11 功能,我会更喜欢它(如果你建议我使用不同的编译器)。
作为我希望能够做的事情的一个简单示例,理想情况下我会运行
g++ MySource.cpp -o MyProgram <magic options>
MySource.cpp 可能看起来像
#include "MyHeader.hpp"
int main() {
test();
}
MyHeader.hpp 可能看起来像
#include <magic_print_stacktrace_library>
void test() {
magic_print_stacktrace_function();
}
如果我要运行 ./MyProgram
,我希望看到类似的东西
File "MyHeader.hpp", line 4, in test
magic_print_stack_tracefunction();
File "MySource.cpp", line 4, in main
test();
最佳答案
下面是我用 backtrace(3) 创建回溯的一些代码:
#include <errno.h>
#include <execinfo.h>
#include <unistd.h>
/*
* call external program addr2line WITHOUT using malloc or stdio or anything
* else that might be problematic if there's memory corruption or exhaustion
*/
const char *addr2line(void *addr, const char *text)
{
int pfd[2], len;
pid_t child;
static char buffer[1024], *p;
const char *argv[5] = { "addr2line", buffer, "-e", program_name, 0 };
uintptr_t a = (uintptr_t)addr;
if (pipe(pfd) < 0) return 0;
p = buffer + sizeof(buffer) - 1;
*p = 0;
while (p > buffer) {
*--p = "0123456789abcdef"[a&0xf];
if (!(a >>= 4)) break; }
argv[1] = p;
if (text && (p = (char *)strchr(text, '('))) {
strncpy(buffer, text, p-text);
buffer[p-text] = 0;
argv[3] = buffer; }
while ((child = fork()) == -1 && errno == EAGAIN);
if (child == -1) return 0;
if (child == 0) {
dup2(pfd[1], 1);
dup2(pfd[1], 2);
close(pfd[0]);
close(pfd[1]);
execvp(argv[0], (char*const*)argv);
_exit(-1); }
close(pfd[1]);
p = buffer;
while (p < buffer + sizeof(buffer) - 1 &&
(len = read(pfd[0], p, buffer+sizeof(buffer)-p-1)) > 0 &&
(p += len) && !memchr(p-len, '\n', len));
close(pfd[0]);
waitpid(child, &len, WNOHANG);
*p = 0;
if ((p = strchr(buffer, '\n'))) *p = 0;
if (buffer[0] == 0 || buffer[0] == '?')
return 0;
return buffer;
}
void stacktrace() {
static void *buffer[64];
int size = backtrace(buffer, 64);
char **strings = backtrace_symbols(buffer, size);
for (int i = 1; i < size; i++) {
if (strings)
std::endl << " " << strings[i] << std::endl;
if (const char *line = addr2line(buffer[i], strings ? strings[i] : 0))
std::cerr << " " << line << std::endl; }
if (size < 1)
std::cerr << "backtrace failed" << std::endl;
}
请注意,它需要知道可执行文件的路径(上面的 program_name
),并且需要使用 -g
构建它以获得完整信息。
关于C++ 漂亮的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27339138/
在通过REST Request Body方法发出搜索请求时,例如 GET /bank/_search { "query": { "match_all": {} }, "sort": [
有没有办法检测用户是否停止滑动?也许 bij 鼠标输入检查之类的。我尝试在 onSliderChange 事件中使用鼠标 isButton0Release 和 hasFocus 来检查用户是否停止滑动
(来源:google.com) 最近,我发现我的应用程序中显示的汉字相当难看。 我想我应该让它们“消除锯齿”。但是,我如何在 Java 中做到这一点? 仅供引用,我没有明确选择要在 GUI 应用程序中
我正在创建一个网站,根据某些条件(即是否登录、是否填写表格等),不同页面的外观可能会有很大差异。这使得需要在不同的时间输出不同的html block 。 但是,这样做会使我的 php 代码看起来很糟糕
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
如果我有一个类包含例如几个将用向量填充的槽,那么问题通常会出现。如果我想让这个类的对象或多或少透明,我会为它实现 print-object。在这里我遇到了问题: 如果我在一行中打印所有内容,REPL
我有一个允许上传到我网站的文件扩展名列表。 我用 jQuery Validation plugin 检查它们. 如果他们选择了不受支持的扩展程序,我会显示一条错误消息。 看起来像 var msg =
在一个本身嵌套在一个或多个父数组/结构/union 中的数组/结构/union 中读取多个数字/字符串的最佳方法是什么? 没有临时变量的第一个例子: printf("%d %d\n", a[9][3]
我是 AngularJS 的新手。我目前在为我的观点编写漂亮的 url 时遇到问题。我已经设置了 $locationProvider.html5Mode(true);删除 #从地址栏中显示的网址。但是
我有一个带有 ElasticSearch 的自动完成 jquery 功能。输入第一个字母时出现以下错误。 跨源请求被阻止:同源策略不允许读取 http://localhost:9200/test12/
我是一名优秀的程序员,十分优秀!