网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月07日漏签0天
c语言吧 关注:801,747贴子:4,375,010
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 53回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

码客 (1):Linux的调试技巧

  • 只看楼主
  • 收藏

  • 回复
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看到吧里蛮多人对linux还是满感兴趣的,今天就写写linux的c语言的调试!!!!


  • 疯狂的小宝life
  • 便当
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
呀,座抢。


2026-01-07 15:16:58
广告
不感兴趣
开通SVIP免广告
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有人么???


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先发一段有bug的代码!!!这是一段设计模式中的观察者模式的代码,但是一运行就会出现“段错误”,现在我们要使用gdb找出bug在哪里
#include <iostream>
class TimerHandler;
class Timer {
public:
Timer() {
handler_ = 0;
}
public:
void SetHandler(TimerHandler *handler) {
handler_ = handler;
}
void Timeout();
private:
TimerHandler *handler_;
};
class TimerHandler {
public:
virtual void OnTimer() = 0;
};
void Timer::Timeout() {
handler_->OnTimer();
}
class SomeTimer : public TimerHandler {
public:
virtual void OnTimer() {
std::cout<< "sometimer" << std::endl;
}
};
int main() {
Timer timer;
SomeTimer sometimer;
timer.Timeout();
return 0;
}


  • c空城i
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前排。


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先普及一下哈,在linux中,我们常用的编译器是g++,调试器是gdb或者cgdb(cgdb是gdb的加强版,我们使用他),编辑器是vim
如果你使用的是ubuntu,那么安装他们很简单,只要输入命令:
sudo apt-get install cgdb
即可


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先我们使用g++编译一下代码(main.cpp),输入"g++ main.cpp"


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2026-01-07 15:10:58
广告
不感兴趣
开通SVIP免广告
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以看到我们已经生成了a.out的可执行文件,输入"a.out"即可运行程序
运行之后,我们可以看到"段错误 (核心已转储)"的错误
我们的主角cgdb终于要登场了,我们要调试一个程序,输入“cgdb ./a.out”即可
输入之后,我们可以看到:

黑乎乎的一片,连我们要调试的源代码都没有。其实是因为g++默认编译一个程序是不带调试信息,我们需要手动加入"-g"命令行
此时输入“g++ ./main.cpp -g”,就可以看到


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

现在正常可以调试了


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先列一下cgdb的常用指令吧


  • 忆_碎碎念
  • 马猴烧酒
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
vs逆天调试,宇宙第一IDE


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
,当你需要在服务器上调试程序的话,你就会觉得vs完全不能为力


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
此时因为我们不知道错误是发生在哪一行,所以我们直接一点,运行“r”,
会出现:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004009a1 in Timer::Timeout (this=0x7fffffffddd0) at ./main.cpp:28
根据上面我们可以看到Timer::Timeout 发生了Segmentation fault,在main.cpp的28行
这行的代码是:
void Timer::Timeout() {
handler_->OnTimer();
}
是handler_->OnTimer();崩溃了,因为handler_是指针,所以可能是指向的地址错误。我们p一下它的值:
(gdb) p handler_
$1 = (TimerHandler *) 0x0
居然是0,现在基本可以明白错误是什么了,是因为handler_没有赋值导致的
所以我们查一下代码看它是在哪里赋值,看了一下,在:
12│ void SetHandler(TimerHandler *handler) {
13│ handler_ = handler;
14│ }
看哪里调用它?居然没有人调用他,所以是这里的问题了
39 Timer timer;
40 SomeTimer sometimer;
41 timer.SetHandler(&timer);
42 timer.Timeout();
加上41行就没有问题了
我们的调试也就到此为止!!!


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 53回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示