gdb学习记录

news/2024/10/13 0:38:06

目录
  • 如何查看地址值
  • 查看当前函数参数
  • 多线程调试
  • 只暂停指定线程,其他线程不影响
  • 总结


如何查看地址值

查看下一个地址:x/x 0x12345679
以八进制显示:x/o 0x12345678
以十进制显示:x/d 0x12345678
显示更多的地址和值:x/8xw 0x12345678(显示从该地址开始的8个字(word),每个字以十六进制格式显示)
p /t __readfds->fds_bits[0] 二进制输出 /x 十六进制输出


查看当前函数参数

当程序在函数中暂停后,即可查看函数的参数。语法如下:

info args

或者

i args


多线程调试

线程状态可以是以下几种:

  • D:不可中断睡眠状态(Uninterruptible Sleep),通常是因为在等待I/O
  • R:正在运行或可运行(Running or Runnable),等待处理器调度
  • S:可中断睡眠状态(Interruptible Sleep),通常是在等待某个事件完成
  • T:已停止(Stopped),通常是由于收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号
  • t:跟踪停止(Traced Stop),在被调试器暂停时发生
  • Z:已僵尸(Zombie),已终止但未被其父进程清理
D (TASK_UNINTERRUPTIBLE) 	不可中断的睡眠状态
R (TASK_RUNNING)			正在运行,或在队列中的进程
S (TASK_INTERRUPTIBLE)		可中断的睡眠状态
T (TASK_STOPPED)			停止状态
t (TASK_TRACED)				被跟踪状态
Z (TASK_DEAD - EXIT_ZOMBIE) 退出状态,但没被父进程收尸,成为僵尸状态
W    						进入内存交换(从内核2.6开始无效)
X (TASK_DEAD - EXIT_DEAD)   退出状态,进程即将被销毁<    高优先级
N    低优先级
L    有些页被锁进内存
s    包含子进程
+    位于前台的进程组;
l    多线程,克隆线程  multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

用 GDB 调试多线程程序_gdb多线程-CSDN博客

调试时除了当前线程在运行,要想规定其他线程的运行情况用这个命令,有三个选择:

  1. set scheduler-locking off:不锁定任何线程,所有线程都可以继续执行,这是默认选项。
  2. set scheduler-locking on:只有当前线程可以执行,其他线程暂停运行。
  3. set scheduler-locking step: 当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。

如果你想要对一个连续的线程ID范围内的所有线程应用命令,例如从线程ID 1到线程ID 10的所有线程

thread apply 1-10 command


只暂停指定线程,其他线程不影响

[gdb调试---多进程、线程]https://zhuanlan.zhihu.com/p/666440042
gdb调试多线程,默认采用all-stop模式,即只要有一个线程暂停执行,其他线程都会暂停。
有时调试其他线程,其他线程正常化执行,可以将all-stop模式改为non-stop模式,即暂停某一线程,不会影响其他线程
命令show non-stop查看当前的non-stop模式状态

(gdb) show non-stop
Controlling the inferior in non-stop mode is off.

命令set non-stop [mode]查看当前的non-stop模式状态

(gdb) set non-stop on
(gdb) show non-stop
Controlling the inferior in non-stop mode is on.

non-stop模式下,在指定线程设置断点,不会中断其他线程



总结

1 attach之前,set non-stop on
2 attach 进程id
3 set scheduler-locking on
4 thread apply all c &  恢复所有线程为运行态
5 开始给ctp动态库底层线程设置断点, b myselect thread 线程id
6 ctpApi_client触发ctp请求
7 gdb中ctp动态库底层线程触发断点,开始单步调试next

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/53207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

UE4 CharacterMovementComponent

之前在学习网络通信时,经常需要对客户端上的行为进行预测,来降低延迟带来的比较差的体验。而UE4为角色移动提供了CharacterMovementComponent这个组件,其在移动时可以发现已经实现了客户端预测。 现在可以通过对CharacterMovementComponent进行扩展,实现我们自定义的运动模…

centos9(linux): 安装clamav

一,官方网站 https://www.clamav.net/ 如图:二,安装 1,开启epel仓库 [root@blog ~]# yum install -y epel-release 2,安装clamav [root@blog ~]# yum install clamav 说明:病毒库数据较大,200多M,安装时需要等待较长时间 安装完成后查看clamav的版本: [root@blog ~]# clam…

pygame手搓五子棋

代码:#coding=utf-8import os,sys,re,time import pygame import random from win32api import GetSystemMetricspygame.init() pygame.display.set_caption("五子棋")percent = 0.6 screen_width = GetSystemMetrics(0) screen_height = GetSystemMetrics(1) windo…

网站提示404错误:页面未找到怎么办

当网站提示 404 Error 或 “页面未找到” 时,这意味着客户端尝试访问的资源在服务器上不存在或无法找到。这种情况很常见,可以通过以下几个步骤来诊断和解决问题: 常见原因URL 输入错误:这是最常见的原因之一。由于人为疏忽或输入错误,导致请求的 URL 与服务器上实际存在的…

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

前言一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。  本篇使用stitcher匹配,进行两张图来视野合并拼接。 Demo 两张图拼接过程步骤一:…

WPF 路由事件

一、什么是路由事件? 根据MSDN定义:功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是由 类的实例支持的 CLR 事件, RoutedEvent 由事件 Windows Presentation Foundation (WPF) 系统处理。…

【转载】Win11优化大小核调度(无需重启)

出处:https://bbs.saraba1st.com/2b/thread-2140520-1-1.html 打开隐藏电源管理选项: 管理员模式运行cmd,分别输入: powercfg -attributes SUB_PROCESSOR 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 -ATTRIB_HIDE powercfg -attributes SUB_PROCESSOR 93b8b6dc-0698-4d1c-9ee4-…

【Pytorch教程】迅速入门Pytorch深度学习框架

@目录前言1.tensor基础操作1.1 tensor的dtype类型1.2 创建tensor(建议写出参数名字)1.2.1 空tensor(无用数据填充)API示例1.2.2 全一tensor1.2.3 全零tensor1.2.4 随机值[0,1)的tensor1.2.5 随机值为整数且规定上下限的tensorAPI示例1.2.6 随机值均值0方差1的tensor1.2.7 从…