我试图在gdb的linux中为创建线程的程序设置一个断点.我想在线程创建时设置一个断点,但不幸的pthread_create是它是一个版本化的符号,我无法得到它的全名.
如果我输入:
catch thread_start
Run Code Online (Sandbox Code Playgroud)
我明白了
Catch of thread_start not yet implemented
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何在gdb中捕获线程创建的最佳方法是什么?
我正在调试一些随机的崩溃错误,但实际上很难深入研究.因为当我打开崩溃转储时,只发现一个错误:
0:000> .exr -1
ExceptionAddress: 00000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
Run Code Online (Sandbox Code Playgroud)
实际上我没有在代码中设置任何硬代码断点,所以我在google中搜索这个异常,有人说这个异常可能是由于堆损坏引起的.所以我的问题是,是否有任何其他原因导致此异常,除了硬编码断点,调试时手动断点,堆损坏?
另一个问题是,我尝试使用Application Verifier来检查堆损坏,我理解它是如何工作的,app验证器将在堆损坏时触发中断指令异常.但是目前,我在没有app验证程序的情况下运行,谁会提出中断指令异常?
附加信息:当前线程的调用堆栈.
*0:000> k
ChildEBP RetAddr
0012f96c 7c827d19 ntdll!KiFastSystemCallRet
0012f970 77e6202c ntdll!NtWaitForMultipleObjects+0xc
0012fa18 7739bbd1 kernel32!WaitForMultipleObjectsEx+0x11a
0012fa74 3b288523 user32!RealMsgWaitForMultipleObjectsEx+0x141
0012fab8 3b32b9bd msenv!EnvironmentMsgLoop+0x1ea
0012fae4 3b32b94d msenv!CMsoCMHandler::FPushMessageLoop+0x86
0012fb0c 3b32b8e9 msenv!SCM::FPushMessageLoop+0xb7
0012fb28 3b32b8b8 msenv!SCM_MsoCompMgr::FPushMessageLoop+0x28
0012fb48 3b32be4e msenv!CMsoComponent::PushMsgLoop+0x28
0012fbe0 3b327561 msenv!VStudioMainLogged+0x482
0012fc0c 3000a4a6 msenv!VStudioMain+0xc1
0012fc38 30007301 devenv!util_CallVsMain+0xff
0012ff14 3000760c devenv!CDevEnvAppId::Run+0x91f
0012ff30 30007680 devenv!WinMain+0x74
0012ffc0 77e6f23b devenv!License::GetPID+0x258
0012fff0 00000000 kernel32!BaseProcessStart+0x23*
Run Code Online (Sandbox Code Playgroud)
我们的应用程序是Visual Studio包.
以下是!analyze -v的结果
0:000> !analyze -v
*******************************************************************************
* …Run Code Online (Sandbox Code Playgroud) 尝试在使用Firefox作为浏览器的Visual Studio 2010中调试Silverlight 4应用程序时,我无法遇到任何断点.我收到消息"断点当前不会被击中".
debugging firefox breakpoints visual-studio-2010 silverlight-4.0
考虑这个多线程程序:
import threading
class SomeThread(threading.Thread):
def run(self):
a = 1
print a
def main():
print 'hola'
someThread = SomeThread()
someThread.start()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
当我用pdb调试这个程序时,在提示符下我首先在两个print语句的每一个上设置一个断点.然后我继续 pdb打破了print 'hola'.我再次继续看到打印在另一个线程中的效果,但pdb不会中断.
帮助命令没有列出任何东西来切换像gdb这样的线程上下文......所以......在一个线程上下文中是否只能设置一个在另一个上下文中跳转的断点?
在PEP 553 breakpoint()实用程序之前的python版本中,推荐的方法是添加(理想情况下是单行)代码以具有可以在某种条件下忽略的断点(例如,全局调试标志或args.debug标志)的推荐方法。
在Perl中,我习惯于使用$DB::single=1;1;单行,我知道我可以放心地留在代码中,perl code.pl除非明确调用,否则不会影响的正常运行perl -d code.pl。例如:
my $a = 1;
$DB::single=1;1; # breakpoint line
my $b = 2;
print "$a $b\n";
Run Code Online (Sandbox Code Playgroud)
如果我将此代码运行为:perl code.pl,它将运行完成。如果我使用以下代码运行该代码:perl -d code.pl,pdb它将在断点行处停止(而不是在带有my $b = 2;语句的下一行之前),因为它在1;语句后包含一条$DB::single=1;语句;
同样,如果我写:
my $debug = 1;
my $a = 1;
$DB::single=$debug;1; # first breakpoint line
my $b = 2;
$DB::single=$debug;1; # second breakpoint line
print "$a $b\n";
# [...] Lots more code sprinkled …Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2005-2015中,可以找到包含某些引用的所有行,并在"查找结果"窗口中显示它们.
既然显示了这些结果行,是否有任何键盘快捷键允许向所有这些行添加调试断点?
在设备上运行iPhone应用程序而不是模拟器时,是否可以实际使用Xcode调试器?也就是说,我可以让设备停在我在代码中设置的断点处,并在设备上运行时逐步执行代码吗?
编辑:我应该提一下,我是Apple的注册开发人员并拥有有效证书.事实上,我可以在我的设备上构建和运行iPhone应用程序.但是,即使在调试模式下,当我在设备上运行时,我的应用程序也不会停在断点上或输出到控制台.如果有帮助,当我在模拟器中运行时,我的应用程序将在调试模式下正常运行(例如,在断点处停止).
编辑2:我已经尝试重置我的手机,完全删除并重新安装Xcode,创建一个新项目,更改本页(以及其他人)的答案中提到的所有设置,清理和构建我的项目,构建和调试. ..如果我单击Pause,它会显示"Debugger出错:退出".:(也许我会尝试在另一台计算机上使用Xcode在此设备上进行调试,看看会发生什么.
编辑3:嗯,我尝试在新项目中使用另一台使用Xcode全新安装的计算机,我仍然无法使设备调试工作.我怀疑这是我的iPhone或电缆吗?我想我不是那么无能,以至于我错过了一些如此令人尴尬的事情,但我已经对这里提到的所有建议进行了双重和三重检查.
编辑4:最终让设备调试工作.我有一种感觉,我的设备上的低级别的东西导致了问题...我在我的系统上做了什么.但是,我在另一个系统上安装了Xcode,并且在同一设备(使用相同的电缆)上进行设备调试时运行良好.在此之后,设备调试开始在我原来的机器上运行,让我相信一些奇怪的硬件标志被搞砸了,并且在第二台机器上以某种方式"重置".无论如何,它现在有效...感谢所有的帮助.:)
此外,我不确定是否最好不要回答这个问题或选择最"有帮助"的答案......
当我在循环中调试出错的东西时,比如在第600次迭代中,对每个循环都要打破是一件痛苦的事.所以我尝试设置一个条件断点,只有在I = 600时才会中断.这样可行,但现在需要几乎整整一分钟才能到达那个点,在此之前几乎是瞬间.发生了什么事,有什么方法可以解决它吗?
我正在尝试使用LLDB(因为我显然不能再使用gdb)来调试我的代码的som,每次我尝试...
(lldb) breakpoint set -f file.c -l 65
Run Code Online (Sandbox Code Playgroud)
我明白了......
Breakpoint 1: no locations (pending)
WARNING: Unable to resolve breakpoint to any actual locations.
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的东西,比如将断点分配给函数等,但我总是得到同样的错误.在跑步时没有休息.请帮忙!
我遇到了 gdb/ddd 中断点太多的情况。
我想一次禁用或删除所有这些,或者除了一个之外的所有。我发现 ddd 断点菜单令人困惑且不可靠。如何使用 gdb 命令执行此操作?