我试图了解strace.
所以我认为一个非常实际的方法是做以下事情:
strace ``echo "1"'' > echo1.txt
strace ``echo "2"'' > echo2.txt
Run Code Online (Sandbox Code Playgroud)
然后:
diff echo1.txt echo2.txt
Run Code Online (Sandbox Code Playgroud)
从那里开始.我的想法是,如果我能看出输出的差异,我可以推断出很多strace告诉我的东西.
不幸的是,echo1.txt和echo2.txt只包含echo的输出,而不是strace.我可以手动复制/粘贴输出,然后运行差异,但现在我只是好奇我做错了什么.
有人可以帮忙吗?
"strace wget grooveshark.com"停止了奇怪的套接字调用,错误的字符串长度,我必须按Ctrl + C终止.
write(2, "Connecting to grooveshark.com (g"..., 67Connecting to grooveshark.com (grooveshark.com)|8.20.213.76|:80... ) = 67
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("8.20.213.76")}, 16) = 0
write(2, "connected.\n", 11connected.
) = 11
select(4, NULL, [3], NULL, {900, 0}) = 1 (out [3], left {899, 999993})
write(3, "GET / HTTP/1.1\r\nUser-Agent: Wget"..., 115) = 115
write(2, "HTTP request sent, awaiting resp"..., 40HTTP request sent, awaiting response... ) = 40 [[ Check this line ]]
select(4, [3], NULL, NULL, {900, …Run Code Online (Sandbox Code Playgroud) 当我做:
sudo strace -p PID 2>&1 | grep -v "recvmsg"
Run Code Online (Sandbox Code Playgroud)
grep匹配它应该匹配的行,但是当我这样做时:
sudo strace -p PID|grep -v "recvmsg"
Run Code Online (Sandbox Code Playgroud)
它仍然显示所有呼叫.这是为什么?
我有一个 sqoop 命令,它使用 hcatalog 参数将数据从 Oracle 导入到 hive orc 表中。
sqoop import -D oraoop.disabled=true -D mapred.child.java.opts="\-Djava.security.egd=file:/dev/../dev/urandom" --connect 'jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbs-dev-v.com)(PORT=1533))(CONNECT_DATA=(SERVICE_NAME=SDADCOM)(Server=Dedicated)))' --username phani --password pass --query "select ITEM_ID,ROLLUP_ITEM_ID,CPI_FORMAT1,CPI_FORMAT2,CPI_FORMAT3,CA_SNO_VALID_CNTRL,CUSTOM_SERIAL_FLAG,INVENTORY_ITEM_STATUS_CODE,LAST_DOS,ESN_CAPABILITY,ROLLUP_FLAG,PRODUCT_FAMILY,PRODUCT_SUB_GROUP,ERP_ITEM_TYPE,MFG_PRODUCT_CONFIG,MFG_SERIAL_FLAG,CA_CONFIG_VALID_CNTRL,CA_INS_VALID_CNTRL,ENABLED_FLAG,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,IB_PRODUCT_TYPE,USER_ITEM_TYPE,ITEM_CREATION_DATE,BASE_PRODUCT_ID,PRD_CATEGORY,TECHNOLOGY_GROUP,BUSINESS_UNIT,CA_DUPL_VALID_CNTRL,SKU_LIST_PRICE,SERV_FEE_VALUE_DOLLAR_AMT,MAX_SERIALIZED_CHILD,PHYSICAL_SN_LOCATION,CPI_LINK,TOTAL_INSTANCES,TOTAL_INSTANCES_ON_CONTRACT,GP_EXCLUSION,LAST_DOA,LAST_DOR from XXCCS_SCDC_PRODUCT_PROFILE where \$CONDITIONS" --split-by ITEM_ID --incremental lastmodified --check-column ITEM_ID -m 4 --hcatalog-home /opt/mapr/hive/hive-1.2/hcatalog --hcatalog-database installbase --hcatalog-table XXCCS_SCDC_PRODUCT_PROFILE --null-string '\\N' --null-non-string '\\N' --boundary-query 'select (select min(ITEM_ID) from XXCCS_SCDC_PRODUCT_PROFILE) as minid ,(select max(ITEM_ID) from XXCCS_SCDC_PRODUCT_PROFILE) as maxid from dual' --hcatalog-storage-stanza 'stored as orc' --verbose
Run Code Online (Sandbox Code Playgroud)
在执行命令时,我收到以下异常
16/10/06 04:26:20 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at …Run Code Online (Sandbox Code Playgroud) 我已经将 pthread 用于多线程程序,并且遇到以下情况。当我在没有 sleep 命令的情况下运行代码时,它会在运行时导致错误,而当我添加 sleep 命令时,程序会按预期运行。
有睡眠:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t m_writer = PTHREAD_MUTEX_INITIALIZER;
void *print_str(void *args) {
sleep(12);
char *str = (char*) args;
pthread_mutex_lock(&m_writer);
printf("%s", str);
pthread_mutex_unlock(&m_writer);
pthread_exit(NULL);
}
int main(int argc, char **argv) {
pthread_t t1;
pthread_create(&t1, NULL, print_str, "Hello\n");
pthread_mutex_lock(&m_writer);
printf("LOL\n");
pthread_mutex_unlock(&m_writer);
pthread_join(t1, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不睡觉:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t m_writer = PTHREAD_MUTEX_INITIALIZER;
void *print_str(void *args) {
char *str = …Run Code Online (Sandbox Code Playgroud) 我跑了strace,在它的输出中,我得到了如下行:
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\273\0\0\0\0\0\0"..., 832) = 832
Run Code Online (Sandbox Code Playgroud)
我已经在读的人读,所以字符串""是指向的buf( ssize_t read(int fd, void *buf, size_t count);),但是那又有什么特定的字符串是什么意思?特别是:
ELF 最有可能与可执行程序链接-为什么在这里输入指针? \ 让我们转义特殊字符-为什么在这里转义数字? > 这是为了什么? 我的理解是,当我们ls在终端输入:
fork()库函数,库函数调用系统调用clone()
来创建子进程。execve()调用以用新内容替换创建的新进程的地址空间。在这种情况下,我希望在ls 输出clone()中看到系统调用。但我只看到而不看到。execve()straceexecve()clone()
可能是什么原因?
我尝试了以下命令:
strace ls
strace -c ls
strace -f ls
Run Code Online (Sandbox Code Playgroud)
操作系统-红帽
计划1:
#include<stdio.h>
void main()
{
printf("Hello\n");
}
Run Code Online (Sandbox Code Playgroud)
输出:
$strace ./a.out
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
.
.
.
.
write(1, "Hello\n", 6Hello
) = 6
exit_group(6) = ?
$
Run Code Online (Sandbox Code Playgroud)
计划2:
#include<stdio.h>
void main()
{
char buf[2];
setbuf(stdout,buf);
printf("Hello\n");
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ strace ./a.out
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
.
.
.
. …Run Code Online (Sandbox Code Playgroud) 我目前正在重新编码 Strace 命令。
我了解此命令的目标,并且可以从可执行文件中捕获一些系统调用。
我的问题是:为什么我没有赶上“写”系统调用?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <wait.h>
int main(int argc, char* argv[]) {
int status;
pid_t pid;
struct user_regs_struct regs;
int counter = 0;
int in_call =0;
switch(pid = fork()) {
case -1:
perror("fork");
exit(1);
case 0:
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execvp(argv[1], argv + 1);
break;
default:
wait(&status);
while (status == 1407) {
ptrace(PTRACE_GETREGS, pid, NULL, ®s);
if(!in_call) {
printf("SystemCall %lld called with %lld, %lld, %lld\n",regs.orig_rax,
regs.rbx, regs.rcx, regs.rdx); …Run Code Online (Sandbox Code Playgroud)