我正在寻找以下调试工具之间的区别.
那些是什么?
E:关于有人在这里偶然发现并且想知道"差异"的相同之处(从手册页缩写):
GDB
允许您查看程序在运行/崩溃时"内部"发生的情况.
Valgrind
一系列灵活的调试和分析工具.
Strace
记录/拦截进程调用/接收的系统调用.
Ltrace
记录/拦截进程调用/接收的信号/动态库/系统调用.
Apport
拦截崩溃/未处理的异常,收集操作系统信息,提供有用的UI,并能够提交非崩溃错误.
ltrace不适用于与-z nowoption链接的二进制文件,这是我的 Ubuntu 19.10 系统上的默认设置。它仅适用于与-z lazy.
有没有其他替代方法可以ltrace完成相同的工作,但也适用于now二进制文件?
我是否可以查看行号和文件名(对于我使用ltrace/strace运行的程序)以及库调用/系统调用信息.
例如:
code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)
Run Code Online (Sandbox Code Playgroud)
ltrace或任何其他工具: malloc(20) :: code.c::21
我已经尝试了ltrace/strace的所有选项,但无法找到获取此信息的方法.
如果不能通过ltrace/strace实现,我们是否有GNU/Linux的任何并行工具选项?
我试过使用ltrace.我试图使用下面的命令来分析其用于通过程序的library.so文件sampleapp,ltrace -c -T --library=library.so --output=out.txt ./SampleApp.但它显示了上述错误.但是library.so是一个调试版本.所以符号表应该在那里.我试过验证它objdump --source library.so | grep CreateSocket().它返回使用该CreateSocket()函数的代码.这意味着它包含一个符号表.那个错误发生的原因呢?
相关文章:测量动态链接库的每秒CPU使用率
我有一个使用动态加载库来加载插件的 C 程序。我想跟踪库调用以调试插件的加载。
我看了看ltrace,但我似乎无法让它工作:
这是一个示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main() {
int *a = malloc(sizeof(int));
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/usr/lib/x86_64-linux-gnu/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译(并删除PIE,否则 ltrace 将看不到任何内容):
gcc main.c -pg -ldl -no-pie
跑步:ltrace ./a.out
输出
__monstartup(0x401170, 0x401431, 0x7fffe3875838, 0x7fffe3875838) = …Run Code Online (Sandbox Code Playgroud) int mprotect(const void *addr, size_t len, int prot);
Run Code Online (Sandbox Code Playgroud)
但是在我正在分析的程序上运行ltrace时,我看到mprotect被调用如下:
mprotect(0x8049000, 4096, 3, 1, 0xb7e057ac) = 0
Run Code Online (Sandbox Code Playgroud)
什么是第四和第五个参数?
编辑:使用ltrace版本0.5.和内核2.6.24-24-通用
谢谢
我正在使用strace/ 监视进程,ltrace希望找到并拦截一个检查并可能激活某种全局共享锁的调用.
虽然我以前曾经在Linux上处理过几种形式的进程间锁定,但我还是要查找要查找的内容.
目前我唯一的嫌疑是futex()在流程执行过程中很早就出现了.
关于我追求的是什么有一些混乱.我正在监视现有进程以调用持久进程间内存或等效内存.我想知道要查找的系统和库调用.我无意自称这些,所以很自然地futex()会出现,我相信很多图书馆都会根据这个来实现他们的锁定调用等.
我想要一个函数名列表或文档链接,我应该在ltrace和strace级别监视(并指定哪个).关于如何跟踪和定位全局锁定的任何其他好建议都会很棒.
有谁知道是否有类似strace,dtruss或dtrace为iPhone?
tester-iPhone:/tmp root$ apt-cache search dtruss
tester-iPhone:/tmp root$ apt-cache search dtrace
tester-iPhone:/tmp root$ apt-cache search trace
tester-iPhone:/tmp root$ apt-get install strace
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Reading package lists... Done Building dependency tree Reading state information... Done E: Couldn't find package strace
tester-iPhone:/tmp root$ apt-get install dtrace
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Reading package lists... Done Building dependency tree Reading state information... Done E: Couldn't find package dtrace
tester-iPhone:/tmp root$ apt-get install ltrace
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Reading package lists... Done Building dependency tree Reading state information... Done …
根据手册页,ltrace 应该拦截并记录任何已执行进程的动态库调用,但它似乎无法在某些二进制文件上正常工作。
这是在尝试跟踪 strcpy 时重现问题的方法。
我第一次看到 ltrace 能够处理一些二进制文件(wget here):
# ltrace -e strcpy wget --help >/dev/null
strcpy(0x63cc23, "auth-no-challenge") = 0x63cc23
strcpy(0x63cc38, "background") = 0x63cc38
[...]
strcpy(0x63cf26, "verbose") = 0x63cf26
strcpy(0x63cf31, "verbose") = 0x63cf31
+++ exited (status 0) +++
Run Code Online (Sandbox Code Playgroud)
现在相同的代码在 httpd 上不起作用:
# ltrace -e strcpy /usr/sbin/httpd -t >/dev/null
Syntax OK
+++ exited (status 0) +++
Run Code Online (Sandbox Code Playgroud)
虽然我们可以确认使用 gdb 调用了 strcpy ,但没有跟踪库调用:
# gdb --quiet --args /usr/sbin/httpd -t
Reading symbols from /usr/sbin/httpd...(no debugging symbols found)...done.
(gdb) b strcpy
Breakpoint 1 at 0x15d08 …Run Code Online (Sandbox Code Playgroud) 正如标题所说,ltrace在我的系统上无法正常工作.在大多数情况下,它没有输出,例如
$ltrace ls
[usual ls output]
+++ exited (status 0) +++
$gcc hello.c
$ltrace ./a.out
Hello world!
+++ exited (status 0) +++
Run Code Online (Sandbox Code Playgroud)
我正在使用最新的ltrace版本(来自包0.7.3-5.1ubuntu4),我甚至尝试从源代码重新编译,没有任何区别.我正在使用Ubuntu 16.10,内核4.8.0-42-generic.gcc版本是6.2.0.
奇怪的是,从Internet下载的二进制文件似乎工作正常,正确显示库调用.
我错过了什么?有人能够重现这个问题吗?