我正在寻找像ltrace或strace这样的工具,它可以跟踪可执行文件中的本地定义函数.ltrace仅跟踪动态库调用,而strace仅跟踪系统调用.例如,给定以下C程序:
#include <stdio.h>
int triple ( int x )
{
return 3 * x;
}
int main (void)
{
printf("%d\n", triple(10));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行程序ltrace将显示调用,printf因为这是一个标准库函数(我的系统上是一个动态库),strace并将显示启动代码,用于实现printf的系统调用和关闭代码的所有系统调用,但我想要一些能告诉我函数triple被调用的东西.假设优化编译器没有内联本地函数,并且二进制文件没有被剥离(符号被删除),是否有工具可以做到这一点?
编辑
几点澄清:
我想知道日志记录和跟踪之间的区别是什么.
差异基本上是跟踪是更详细的日志,为开发人员提供了在运行时调试应用程序的工具吗?
我一直在尝试使用log4net并进行日志记录.现在我想知道我是否应该进行跟踪以及是否可以/应该使用log4net进行此目的.我应该使用log4net进行跟踪吗?log4net记录器是否有一些跟踪级别?我应该使用不同的日志级别进行调试和跟踪,还是可以使用相同的?你能给出一个简单的例子来说明如何对一个简单的方法进行记录和跟踪吗?
编辑:尽管下面有一些有用的答案,我仍然不确定我应该如何进行跟踪与日志记录.
我的业务层中有以下方法,我想添加日志/跟踪.我想知道如何有效地做到这一点.在记录/跟踪方面,以下方法是否可以接受?日志消息应该是Info类型而不是Debug类型吗?我记录的调试消息是否被视为跟踪?你会怎么改变它?
IEnumerable<Car> GetCars()
{
try
{
logger.Debug("Getting cars");
IEnumerable<Car> cars = CarAccessor.GetCars().ConvertAll(DataAccessToBusinessConverter);
logger.Debug("Got total of " + cars.Count + " cars");
} catch (Exception e) {
logger.Error("Error when getting cars", e);
throw new Exception("Unexpected error when getting cars");
}
}
我知道bash -x script.sh在实际执行之前会执行脚本打印每一行.如何使Perl和Python解释器做同样的事情?
我的Python库只是改变了它是从主模块的名称foo.bar来foobar.对于后向compat,foo.bar仍然存在,但导入它会引发一些警告.现在,似乎一些示例程序仍然从旧模块导入,但不是直接导入.
我想找到错误的import陈述.是否有任何工具允许我跟踪导入并找到罪魁祸首而不涉及所有代码?
我在perl中有一个系统脚本.我需要一些等效的bash -x来确定脚本出了什么问题.有没有相当的东西?
编辑:bash -x的作用是它在评估时打印每一行.这使得调试代码只是缺少一些路径变量或文件非常容易.
当我在RUNTIME与基于AJAX的应用程序交互时,我希望控制台能够吐出它所调用的所有函数.(所以没有堆栈跟踪,或断点,或分析或任何东西)
例如,假设我在页面上按了一个按钮.我希望它能够在发生这种情况时返回它经历的所有功能:
所以我会在控制台中看到类似的东西(当我按下按钮时):
1. button1Clicked();
2. calculating();
3. printingResults();
Run Code Online (Sandbox Code Playgroud)
这基本上意味着button1Clicked()调用calculate()调用了printingResults()
是否有实用程序,插件,浏览器或者某种语言可以执行此操作?我正在使用谷歌浏览器,顺便说一句.
ps和NO我不想通过每个函数并添加一个"console.log("inside function X")"太多工作的b/c
pps作为一个额外的奖励,我希望看到传递给函数的参数,但也许是推动它.:>
有没有相当于
PRINT 'hello world'
Run Code Online (Sandbox Code Playgroud)
哪个可以从CLR(C#)代码调用?
我正在尝试在我的函数中输出一些调试信息.我无法运行VS调试器,因为这是一个远程服务器.
谢谢!
我正在尝试找到一个GUI来解析和查看Xdebug跟踪文件.虽然你可以使它们具有人类可读性,但是线条的数量太多使它无法使用.
我正在寻找像KCachegrind这样的东西,但是对于跟踪文件.我所有这一切背后的主要目标是找到记忆猪的内容.
为了更好地理解"引擎盖下"发生的事情,我希望对我的应用程序中发生的任何通知进行完整的跟踪.
像我一样天真,我尝试的第一件事就是这样注册:
我的应用程序的某个地方:
{
[...]
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(traceNotifications:) name:nil object:nil];
[...]
}
- (void)traceNotifications:(NSNotification *)notification
{
NSLog(@"received notification %@", [notification name]);
}
Run Code Online (Sandbox Code Playgroud)
我实际上通过这种方式获得了许多通知.但在某些时候,应用程序确实崩溃了.堆栈跟踪显示它在realizeClass中与EXC_BAD_ACCESS崩溃,根据我的经验,它确实表明在释放后调用了某些东西.然而,我的观察对象仍然存在,它的解除分配器尚未被调用.
我试过的下一件事是设置一个断点-[NSNotificationCenter postNotification:],然后po {NSNotification *}($ebp+16)每当我的断点被困时在gdb-console内部运行.这确实揭示了一些通知,但不是我期望/希望的所有通知.例如,我的应用程序确实正确处理了方向更改,但在重新定向设备时(在模拟器中)我没有看到任何通知被捕获.
我错过了什么?有没有办法(例如工具)可靠地观察NSNotificationCenter?
谢谢你的任何提示.
我想知道如何在LinqToSql中跟踪生成的SQL,如DataContext.
我还在Jaroslaw Kowalski的博客上阅读了有关EFProviderWrapper解决方案的文章,但它基于ObjectContext,不适用于DbContext.
任何人都知道如何在DbContext中执行此操作?
谢谢.