我试图通过GDB通过控制台调试PHP脚本,但我无法设置断点.这就是我所做的. 我创建了一个带有此内容的脚本: This is free software: you are free to change and redistribute it. There is NO WARRAN
以下是关于 gdb 的编程技术问答
问题 如果我从主机进行编译并运行,我可以设置并达到断点,但是如果我从Docker容器内部进行GDB,则不会达到设置的断点. 复制步骤(所有摘要都准备好了) 创建一个docker文件: cat Dockerfile FROM ubuntu RUN apt-get update RUN apt-get install -y build-essential gdb EOF 构建图像并在其中运行交互式会话: docker build -t gdb_problem_testing . && docker run --rm -it gdb_problem_testing bash 从容器的内部创建小的main.cpp,编译和运行GDB: cat main.cpp && g++ -g main.cpp && gdb -ex 'break 5' -ex 'run' ./a.out #include i
i正在通过试图更改静态常数阵列结构的程序引起的Linux应用程序中的SEG故障(因此数据位于ELF的仅读取部分中,然后将其加载到当时的页面中给予仅阅读许可). 在GDB中,我在做坏商店的汇编器线上放了一个断点,当它停在那里时,我使用GDB手动执行了等效的写动. GDB在没有任何抱怨的情况下做到了这一点,并阅读了后书证明它确实已经写了.我查看/proc/thepid/maps,该特定页面仍然标记为"不可写". 所以我的问题是:GDB是否在只读页面上临时设置写入权限,执行写入,然后重置权限?谢谢. 解决方案 gdb是否暂时设置写入权限 no. 在linux/*86,ptrace()上(这是GDB用来读写下次(被调试)过程内存的(被调试)过程内存)允许读取和写入页面,而下等是不可读取/写作的页面,完全导致您所描述的混乱. 这可以被视为内核中的错误. 应注意的是,内核具有允许Ptrace写入正常无关的.text部分,以使调试器能够种植断点断点/陷阱
在/display.html?id = 37194#txn-641389 我重新打开了一个与libreadline XS绑定结合使用的perl崩溃的错误.我附上了必要的调试信息,但是直到现在,维护者还没有承认.我最终要解决这个问题.在 devel :: devel :: depl 和perl debugger中,这是给您带来的主要不便.我的胆量和c夫几乎不存在,所以我不能做通常的事情,并自己制作一个补丁.因此,我想雇用您的帮助;更多眼球↔浅虫和所有这些. 我给你的问题: 尽管-DPERL_USE_SAFE_PUTENV,您可以再现此崩溃吗?如果是,让我们比较什么是常见因素. 您知道原因是什么,如何找到它? 我有一个调试perl并知道如何使用GDB,但是我必须在哪里设置一个断点才能正确观察崩溃? 解决方案 问题是我的perl从来没有安全的putenv.该选项不是-DPERL_USE_SAFE_PUTENV,而是-Accflags="-DPERL_USE_SAFE_P
我有一个跑步的perl流程,我想通过调试器戳入内部,看看有什么问题.我无法重新启动该过程.我可以将调试器附加到运行过程中吗?我知道我可以做gdb -p,但是gdb对我没有帮助.我已经尝试了 enbugger ,但失败了: $ perl -e 'while (1) {}'& [1] 86836 $ gdb -p 86836 … Attaching to process 86836. Reading symbols for shared libraries . done Reading symbols for shared libraries ............................. done Reading symbols for shared libraries + done 0x000000010c1694c6 in Perl_pp_stub () (gdb) call (void*)Perl_eval_pv("require Enbugger;Enbugger
我需要一个适合Windows和Linux的优秀分析器(它们不一定是相同的;对于每个OS的单独建议),可以将其附加到已经运行的过程中,该过程未在任何"特殊"中编译为未编译的过程方式并为我提供有关该过程大部分时间的功能的统计信息.我有一些长期运行的科学代码,我想获得它在执行各个阶段的大部分时间的快照,,并且是能够获得结果而无需运行整个程序开始完成. 我正在使用的编译器(Digital Mars d)附带了仪表profiler.对于我正在跑步的工作来说,这太慢了.由于我只想识别主要的瓶颈,因此我想要快速,易于使用的东西,即使它只是非常准确的.理想情况下,它也应该能够同时介绍所有线程并给我一个汇总报告. 在Linux上,我一直在使用GDB作为穷人的抽样探测器(暂停了几次我的应用程序,看看它的功能).基本上,这是我要寻找的更自动化的版本. 最后一个要求:在Linux上,必须易于安装而无需根特权,因为我将在无法访问根的服务器上运行它. 编辑:虽然代码是在D,D,D的编译模型等
当我将list mystruct键入GDB时,我会收到用于定义mystruct的代码行.如何要求GDB给我正在阅读的文件以打印这些行?从GDB Python接口获取该文件是可取的.越容易解析越好. 谢谢! 解决方案 用于显示类型的定义有一个命令 ptype : $ ptype mystruct ... 要知道定义的类型,命令 info类型 regex : $ info types ^mystruct$ : 和打印源文件的行,命令 list 文件名:start_line,fileName:end_line : $ list myfile.c:100,myfile.c:110 如果不够 $ list + 请注意,可能存在几种相同类型的定义,因此信息类型可以提供多个位置. 更新 由于这是编译器(生成调试信息,例如矮人)和 gdb 之间的兼容性问题,因此出于某种原因,并非总是可以检索详细信息,例如.
如何使GDB使用不同目录来查找源文件. 例如,在编译期间我的源文件是在目录中: /home/foo/bar.c 接下来,我将其移至目录: /tmp/debug/home/foo/bar.c 如何在此目录中执行GDB搜索? 根据这个网站我应该只使用命令: > dir /tmp/debug/ ,但它不起作用.我从GDB收到消息foo.c: "No such file or directory" 解决方案 set substitute-path /home/foo /tmp/debug/home/foo /GDB/source-path.html#index-set-substitute_002dpath
我在我无法直接访问的远程系统上生成了一个核心文件.我还从远程系统中有库文件的本地副本,以及崩溃程序的可执行文件. 我想在GDB中分析此核心转储. 例如: gdb path/to/executable path/to/corefile 我的库在当前目录中. 过去,我见过debuggers通过提供选项" -p"来实现此目标.或" -p/=.";所以我的问题是: 在分析gdb中的corefile时,如何指定库首先从路径上加载的库? ? 解决方案 启动GDB而不指定可执行文件或核心文件,然后输入以下命令: set solib-absolute-prefix ./usr file path/to/executable core-file path/to/corefile 您将需要确保准确地从目标系统镜像您的库路径.以上是用于调试不匹配主机的目标的,这就是为什么复制包含库的根文件系统结构很重要. 如果您要远程调试与主机相同的架构和Linux/g
我正在尝试在GDB中启动旧应用程序,并且要求它是argv[0]值不包含字母数字字符以外的任何内容. 每当我在GDB中启动程序时,它似乎将名称扩展为运行程序之前的完整路径,因此我会遇到一个错误(因为它无法处理斜线): "找不到/home/user/myapp ..." 是否可以在具有相对路径的GDB中运行一个程序,以便看到" myApp"? 解决方案 GDB通常使用shell命令行 运行目标命令 exec program_pathname program_arguments 但它具有 exec exec_wrapper program_pathname program_arguments exec_wrapper 通常是另一个命令,但是这可以是exec命令接受的选项. 许多外壳(bash,zsh,ksh93)支持-a选项exec命令设置argv [0]. 因此,如果您的外壳支持exec -a,则可以使用以下操作以使用argv [0
我有一个用帕斯卡(Pascal)编写的脚本.我会以这种方式进行调试:在每一行停止,将所有变量的值转储在内存中,然后转到下一行.是否可以使用GDB或其他一些用于Linux的开源工具进行操作? 解决方案 带有选项-g的编译文件: fpc/gpc -g file.pas 为此文件运行gdb: gdb file 设置所有需要的变量: display first_var display second_var ... 开始调试: start 通过按下s您可以继续到下一行. 其他解决方案 我将提供一个概述,该证明是通过(单线线程)程序逐步倾倒所有变量,通过使用GDB的Python API: 来倾倒所有变量 # Usage: gdb -x dump-vars-each-step.py PROGRAM import gdb import re import logging LOG_LEVEL = logging.INFO def dump
在工作中,我面对以下问题: 我需要解析GDB调试信息. 单独的调试信息文件是二进制文件,因此我不知道格式而无法阅读它. 所以,这是一个问题: 是否有任何准备解析器用于GDB信息,或者至少对其进行了描述? 解决方案 是否有GDB信息的现成解析器 没有这样的东西.有各种调试信息格式(DWARF,STABS等),这些调试格式的多个消费者(GDB就是这样的消费者). 如果您在Linux上,则默认调试格式为DWARF,记录为在这里.. 我需要解析...调试信息 根据您的实际需求,readelf -w或已经提到的libdwarf可能是合适的.或者,您可以从头开始编写自己的解析器,尽管它不太可能是最佳解决方案. 其他解决方案 您可能应该看看Libdwarf.请参阅 http://sourceforge.net/project.net/projects/libdwarf//wiki.dwarfstd.org/index.php?
我经历了GDB将字符串作为参数传递给构造函数的怪异行为. 该代码工作正常,但是当我在调试器中逐步完成时,GDB似乎认为我的参数在一个不同的地址.有人知道这里发生了什么吗? 这是我可以创建的最简单的程序来证明问题: --(jwcacces@neptune)--------------------------------------------(/home/jwcacces)-- --$ nl gdb_weird.cpp 1 #include 2 #include 3 4 class C 5 { 6 public: 7 C(std::string str) 8 { 9 std::string* str_ptr = &str; 10 std::cout
我想知道的是,如果可能的是,在Linux中的调试会话中(读:GDB :))停止执行单个线程,使其他线程运行. 如果有人好奇地知道为什么继续阅读: 我写了一个软件看门狗C ++类(使用QT).我使用一个简单的多线程程序对其进行了测试,但是一旦将代码集成到真实的应用程序中,我也想测试代码.如果我可以从调试器中停止线程,那将简化此测试阶段. :) 欢呼 Sergio 解决方案 在运行或附加到程序之前,请使用此命令序列: 启用异步接口: 设置目标-Async 1 如果使用CLI,则分页不停地打破: 设置分页 打开它: 在 上不停地设置 使用这些命令来操纵不间断模式设置: 启用不间断模式的选择: 在 上不停地设置 禁用非停机模式的选择: 设置不间断的 显示当前的不间断启用设置: 显示不间断 参考: -mode.html#non_002dstop mode 其他解决方案 您可以使用TotalView调试
对不起,对不描述的标题,没什么更好的. 当我通过GDB运行程序以查找分割故障时,我会得到此垃圾的行的千> : (gdb) step _IO_new_file_xsputn (f=0x76fa0b40 , data=0x7efff284, n=7) at fileops.c 1279 fileops.c: No such file or directory. (gdb) step 1273 in fileops.c (gdb) step 1279 in fileops.c (gdb) step 1286 in fileops.c (gdb) step 1288 in fileops.c (gdb) step 1289 in fileops.c (gdb) step 1292 in fileops.c (gdb) step 1294 in fileops.c (gdb) step 1292 i
再次更新 我试图创建一些简单的重现方法,但没有成功. 到目前为止,我尝试了各种简单的阵列分配和操纵,但是它们都抛出了一个记忆,而不仅仅是sigkill崩溃. 例如: x =np.asarray(range(999999999)) 或: x = np.empty([100,100,100,100,7]) 只需尽可能地扔内存. 我希望在某个时候有一种简单的方法来重新创建它. 结束更新 我有一个python脚本运行numpy/scipy和一些自定义C扩展. 在我的Ubuntu 14.04上,在虚拟盒下,它可以完成. 在Amazon EC2 T2 Micro实例上,它以输出为终止(运行一段时间后): 被杀 在Python调试器下运行,信号也没有被捕获,调试器也退出. 在Strace下跑步,我得到: munmap(0x7fa5b7fa6000, 67112960) = 0 mmap(NULL,
我通过自制安装了GDB 7.8.1和GCC 4.9. 当我打开由GCC计算(gcc-4.9 -g xxx.c -o xxx)程序生成的核心文件时,它报告了: → gdb ./list_test /cores/core.1176 GNU gdb (GDB) 7.8.1 Copyright (C) 2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This G
我使用苹果的GDB,以下版本 GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul 3 01:19:56 UTC 2009) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_
我尝试编译7.x版的GDB,而没有任何运气. 我编码可执行文件(http://sourceware.org/gdb/wiki/buildingondarwin). 有以下版本存在这些问题. 7.5,7.4,git克隆:启动GBD时的应用程序和不同的系统库,未知加载命令0x2a(和其他).例如,在尝试打印向量时,我总是会得到: 找不到" Main(int,char **)" 的框架基础 7.3(MacPorts和GDB-Website):启动应用程序时,它无法设置断点并继续运行. (gdb) start Temporary breakpoint 1 at 0x100000950: file ../src/main.cpp, line 15. Starting program: [...] BFD: unable to read unknown load command 0x24 BFD: unable to read unknown load command 0x2a
我已经在OS X Mavericks(10.9.2)下安装了gdb 7.7(来自GNU源).我对其进行了编码,因此每当我调试不包含模板的文件时都可以正常工作.但是,它无法介入模板函数(可以介入常规功能,但只是无法介入模板的功能).当我在调试会话中键入step命令时,它只是对函数进行逐步介绍,好像模板函数不存在调试符号一样.我的模板函数甚至不是成员函数,只是一个简单的函数,定义了main.cpp. . 我用g++ -g -O0 main.cpp编译程序(我使用macports而不是clang++的g++4.8.2),甚至尝试过-fno-inline,仍然相同的行为,无法介入模板函数.这是OS X Mavericks下的gdb已知问题吗?或者,任何人都可以重现该错误吗? 我的代码: #include template // template void f(T x) { std::cout