linux调试工具kdbg,Linux下图形化调试工具: kdbg, Affinic

在linux下调试确实是个很麻烦的事, 用gdb调试不怎么方便, 没有在windows下用vs爽, 主要原因还是因为gdb是用命令行形式, 其实在linux下也有一些基于gdb的图形化调试工具.

1. kdbg

ubuntu下 直接 sudo apt-get install kdbg 即可安装.

若启动后出现 MNG error 11: Function is invalid at this point; chunk MHDR; subcode 0:0 错误, 那么就删除 /usr/share/kde4/apps/kdbg/icons/hicolor/22x22/actions/pulse.mng 这个文件就好了.

界面比较友好. 调试方法很简单:

1.首先g++ -g file.cpp 或  g++ --debug file.cpp  得到文件a.out

2.运行Kdbg选择 File->Excutable 再选中a.out 这个文件,调试代码会自动载入.

3.鼠标点调试代码最左边点空白处,变红色则设置了断点,

4.按F5开始调试 F10单步 F6跳出 F7到鼠标 F8跟进。View->Locals可看变量数据。

2. Affinic Debugger GUI

ubuntu软件中心可以搜索到该软件, 免费, 但要注册才能下载.

与kdbg类似, 选 File - Program 加载可执行文件. 但Affinic比kdbg好的地方是可以与后台的GDB交互, 既仍可以输入GDB中的命令行命令, 也可以看到GDB的输出, 利用这个功能加上 gdb中调试stl 文章中介绍的方法, 我们就既可以方便的调试STL, 也可以使用图形界面方便的观察其他变量.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个驱动程序获取CmpTraceRoutine函数地址的示例代码,仅供参考。 ```cpp #include <ntddk.h> NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); // 获取ntoskrnl.exe模块的基址 PVOID ntoskrnlBase = GetKernelBase(); if (ntoskrnlBase == NULL) { return STATUS_UNSUCCESSFUL; } // 获取CmpTraceRoutine函数的地址 PVOID cmpTraceRoutine = GetFunctionAddress(ntoskrnlBase, "CmpTraceRoutine"); if (cmpTraceRoutine == NULL) { return STATUS_UNSUCCESSFUL; } // 使用CmpTraceRoutine函数 // ... return STATUS_SUCCESS; } PVOID GetKernelBase() { NTSTATUS status; ULONG size = 0; PVOID base = NULL; // 获取系统信息的长度 status = ZwQuerySystemInformation(SystemModuleInformation, NULL, 0, &size); if (status != STATUS_INFO_LENGTH_MISMATCH) { return NULL; } // 分配足够大的内存缓冲区 PVOID buffer = ExAllocatePoolWithTag(NonPagedPoolNx, size, 'KDBG'); if (buffer == NULL) { return NULL; } // 获取系统信息 status = ZwQuerySystemInformation(SystemModuleInformation, buffer, size, &size); if (NT_SUCCESS(status)) { PSYSTEM_MODULE_INFORMATION modules = (PSYSTEM_MODULE_INFORMATION)buffer; base = modules->Module[0].ImageBase; } // 释放内存缓冲区 ExFreePoolWithTag(buffer, 'KDBG'); return base; } PVOID GetFunctionAddress(PVOID ModuleBase, PCHAR FunctionName) { PIMAGE_NT_HEADERS ntHeaders = RtlImageNtHeader(ModuleBase); if (ntHeaders == NULL) { return NULL; } // 获取导出表RVA和大小 PIMAGE_DATA_DIRECTORY exportDirectory = &ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; if (exportDirectory->VirtualAddress == 0 || exportDirectory->Size == 0) { return NULL; } // 获取导出表的指针 PIMAGE_EXPORT_DIRECTORY exportTable = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ModuleBase + exportDirectory->VirtualAddress); // 获取导出表中函数名称的指针表和地址表 PDWORD nameTable = (PDWORD)((ULONG_PTR)ModuleBase + exportTable->AddressOfNames); PDWORD addressTable = (PDWORD)((ULONG_PTR)ModuleBase + exportTable->AddressOfFunctions); PWORD ordinalTable = (PWORD)((ULONG_PTR)ModuleBase + exportTable->AddressOfNameOrdinals); // 在导出表中查找函数名称 for (DWORD i = 0; i < exportTable->NumberOfNames; i++) { PCHAR name = (PCHAR)((ULONG_PTR)ModuleBase + nameTable[i]); if (_stricmp(name, FunctionName) == 0) { WORD ordinal = ordinalTable[i]; ULONG_PTR address = (ULONG_PTR)ModuleBase + addressTable[ordinal]; return (PVOID)address; } } return NULL; } ``` 这个驱动程序使用`ZwQuerySystemInformation`函数获取系统模块的信息,然后遍历模块列表找到`ntoskrnl.exe`模块的基址。接着,使用`RtlImageNtHeader`函数读取模块的PE头,然后在导出表中查找`CmpTraceRoutine`函数的地址。最后,使用`CmpTraceRoutine`函数执行相关操作。 请注意,这个示例代码仅供参考,如果要在实际环境中使用,请根据具体情况进行适当修改和优化,并遵循内核编程的最佳实践和安全原则,以确保操作的正确性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值