关闭

【github myLocker】线程切换调试,读写指针修改文件,socket 阻塞设置

标签: socket线程调试指针github
252人阅读 评论(0) 收藏 举报
分类:

线程切换调试

gdb查看帮助:help

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

查看特定类的命令:
比如 help command

(gdb) help running
...
target remote -- Use a remote computer via a serial line
target tfile -- Use a trace file as a target
task -- Use this command to switch between Ada tasks
thread -- Use this command to switch between threads
thread apply -- Apply a command to a list of threads
thread apply all -- Apply a command to all threads
until -- Execute until the program reaches a source line greater than the current

由此可知切换线程的命令是thread。后面加上thread Id即可。

(gdb) help status
...
info symbol -- Describe what symbol is at location ADDR
info target -- Names of targets and files being debugged
info tasks -- Provide information about all known Ada tasks
info terminal -- Print inferior's saved terminal status
info threads -- IDs of currently known threads
info tracepoints -- Status of tracepoints

查看所有线程的命令是info threads
eg:

(gdb) info thread
  4 Thread 0xb67ffb70 (LWP 3353)  0x00110424 in __kernel_vsyscall ()
  3 Thread 0xb73ffb70 (LWP 3352)  0x00110424 in __kernel_vsyscall ()
  2 Thread 0xb7fe7b70 (LWP 3351)  0x00110424 in __kernel_vsyscall ()
* 1 Thread 0xb7fe88d0 (LWP 3348)  main () at main.c:85

(gdb) thread 4
[Switching to thread 4 (Thread 0xb67ffb70 (LWP 3353))]#0  0x00110424 in __kernel_vsyscall ()

某一次,程序在输入加密文本后出现了段错误,我们可以利用bt, thread TID等命令查看具体的细节。

[lockerThread] ret: 7, recv buff: encrypt
[lockerThread] start encrypt text file...
[lockerThread] please enter filename to enrypt which file is put in folder.
[main] retval from textCode thread: 1
[Thread 0xb7fe7b70 (LWP 3377) exited]
[main] retval from textRW thread: 1
[Thread 0xb73ffb70 (LWP 3378) exited]
txt

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb69feb70 (LWP 3379)]
0x00289396 in strcat () from /lib/libc.so.6
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-17.el6.i686
(gdb) info thread
* 4 Thread 0xb69feb70 (LWP 3379)  0x00289396 in strcat () from /lib/libc.so.6
  1 Thread 0xb7fe88d0 (LWP 3374)  0x00110424 in __kernel_vsyscall ()
(gdb) thread 4
[Switching to thread 4 (Thread 0xb69feb70 (LWP 3379))]#0  0x00289396 in strcat () from /lib/libc.so.6
(gdb) bt
#0  0x00289396 in strcat () from /lib/libc.so.6
#1  0x08049fbe in pth_encrypt () at pthLocker.c:106
#2  0x08049f29 in pthLocker_run (arg=0x0) at pthLocker.c:78
#3  0x003b0bc9 in start_thread () from /lib/libpthread.so.0
#4  0x002f2dee in clone () from /lib/libc.so.6

由此可见,问题出现在 pthLocker.c文件的pth_encrypt ()函数的strcat()处。

读写指针修改文件

只用一个指针读取文件内容并修改内容。
应用fseek移动文件指针指向的位置,使用ftell()获取指针的当前位置。
int fseek(FILE *stream, long offset, int whence)的第三个参数可以取SEEK_SET(文件开始),SEEK_END(文件末尾),SEEK_CUR(当前读取位置)。offset是相对whence的值,可正可负,文件结束位置方向为正,开始方向位置为负。

#include <stdio.h>

int main(){
    FILE* text_f = fopen("txt","r+");
    long pos, posEnd;
    char ch;

    fseek(text_f,0L,SEEK_END);
    posEnd = ftell(text_f);
    fseek(text_f,0L,SEEK_SET);
    pos = ftell(text_f);
    printf("len is %d\n",posEnd-pos);
    printf("pos is %d\n",pos);

    while(pos < posEnd-1){
        fscanf(text_f,"%c",&ch);
        int primer = 2;
        ch = ch^primer;
        fseek(text_f,-1,SEEK_CUR);
        fprintf(text_f,"%c",ch);
        pos = ftell(text_f);
        printf("pos is %d\n",pos);
    }

    return 0;
}

SEEK_SET是0处,SEEK_END是strlen(文本内容)+1处。pos < posEnd-1相当于 pos < strlenSEEK_END-SEEK_SET等于sizeof(str), SEEK_END-SEEK_SET-1等于strlen(str).

socket 阻塞设置

为什么在下面的while(1)循环中,printf只打出了一次?
下面是线程pthTextCode,线程函数有一个while(1)循环,用于接收main传过来的消息,让我困惑的是为什么确认消息的printf只有在确实接收了消息才打印?(虽然这确实是好事,但我想知道究竟发生了什么)

    while(1){
        int client_len;
        client_len = sizeof(client);
        memset(buff,0,pthTextCode_buff_len);
        ret = recvfrom(sock_fd,buff,pthTextCode_buff_len,0,(struct sockaddr*)&client,&client_len);
        printf("\033[1;33m[textCodeThread]\033[0m ret: %d, recv buff: %s\n",ret,buff);
        if(ret > 0){
            short analyze = 0;
...

问题出在sock_fd上,他没有被设置成非阻塞。
相关说明:

F_GETFL (void)
Read the file status flags; arg is ignored.
F_SETFL (long)
Set the file status flags to the value specified by arg.
File access mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation flags (i.e., O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are ignored. On Linux this command can only change the O_APPEND, O_ASYNC,O_DIRECT, O_NOATIME, and O_NONBLOCK flags.

使用fcntl函数设置socket:

flag = fcntl(sock_fd,F_GETFL);
/* sock_fd not blocked */
fcntl(sock_fd,F_SETFL,flag|O_NONBLOCK);

对应的sock_fd即为非阻塞类型。

工程地址:https://github.com/theArcticOcean/myLocker

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java网络编程(一):java传统的阻塞IO以及多线程解决方案

最近在看一些IO模型相关的东西,被同步IO、异步IO、阻塞IO、非阻塞IO概念弄的有点晕,后面再慢慢学习和领悟。我们以socket IO编程为例子,我用的是JDK1.7.0_80,测试工具用的是Soc...
  • aitangyong
  • aitangyong
  • 2015-11-04 16:09
  • 1306

php的非阻塞套接字socket

本文的需求是检测数量不确定的服务器在不在线的问题。一开始是准备网页异步调用php去检测socket连接,所以没弄过这块内容的我就上网搜了类似php异步调用socket等内容。真是~。~ 先说说搜索结果...
  • CraigChencc
  • CraigChencc
  • 2016-07-24 22:39
  • 1773

读Socket流时产生阻塞的解决方案

在用socket写一个服务器时遇到了问题于是将主要的问题抽了出来,代码如下,由于代码很简单于是也没有注释。public class Main { private static ServerSo...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-11-01 08:50
  • 15701

性能测试瓶颈定位——磁盘IO和线程切换过多

1、 第一次打压时,发现A请求压力80tps后,cpu占用就非常高了(24核的机器,每个cpu占用率全面飙到80%以上),且设置的检查点没有任何报错。 2、 了解了一下后台实现逻辑:大体...
  • lin443514407lin
  • lin443514407lin
  • 2017-01-17 09:09
  • 357

嵌入式操作系统内核原理和开发(线程切换)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】    在操作系统中,线程切换是很重要的一个环节。如果没有线程的切换,我们如何才能实现多线程的并...
  • feixiaoxing
  • feixiaoxing
  • 2012-05-30 23:44
  • 4321

迷之RxJava —— 线程切换

RxJava最迷人的是什么? 答案就是把异步序列写到一个工作流里!和javascript的Promise/A如出一辙。 OK,在java中做异步的事情在我们传统理解过来可不方便,而且,如果要让异步...
  • jikeehuang
  • jikeehuang
  • 2016-05-19 15:17
  • 5343

网络请求工具类之OkHttp3封装(二)下(支持请求取消、异步请求的线程切换)

紧接着上篇说的任务2:异步请求采用UI线程回调方式。 首先采用Handler进行线程间的通信,顺便优化下回调方法,加入HttpInfo以做到工具类使用的渗透性。 在OkHttpUtil中声明一个自定义...
  • zsf442553199
  • zsf442553199
  • 2016-06-24 15:32
  • 2045

Android任意时刻从子线程切换到主线程的实现

引入 在Android开发中常常会遇到网络请求,数据库数据准备等一些耗时的操作;而这些操作是不允许在主线程中进行的。因为这样会堵塞主线程导致程序出现未响应情况。 所以只能另起一个子线程...
  • jdsjlzx
  • jdsjlzx
  • 2014-12-02 10:05
  • 9716

代码技巧1监听器从子线程切换主线程

举个例子: 在请求一个接口或者进行IO处理的时候,因为这都属于耗时行为,所以都要放到子线程中去,当处理完毕的时候,通常会回调一个接口, 因为接口是在子线程中回调的,所以在回调的地方如果直接操作主线...
  • jiankeufo
  • jiankeufo
  • 2017-01-12 16:57
  • 195

一张图搞定-RxJava2的线程切换原理和内存泄露问题

RxJava2的线程切换原理和内存泄露问题分析 不管你信不信,一张图搞定此问题
  • u011291205
  • u011291205
  • 2017-06-11 17:01
  • 7073
    个人资料
    • 访问:327285次
    • 积分:8806
    • 等级:
    • 排名:第2521名
    • 原创:574篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论