|
1
18
添加时有一些情况
所以使用
|
|
|
2
7
您很难说服我不要使用日志记录(在这种情况下,printf是一种特殊的日志记录形式)来调试。显然,要调试崩溃,首先要做的是获取回溯并使用purify或类似的工具,但是如果原因不明显,那么日志记录是迄今为止您可以使用的最佳工具之一。调试器允许您专注于细节,日志记录可以让您了解更大的情况。Both are useful. |
|
|
3
4
Sounds like you're dealing with a heisenbug .
我认为使用
|
|
|
4
2
imho每个开发人员仍然依赖打印输出。我们刚学会称之为“详细日志”。 更重要的是,我看到的主要问题是,人们对待印刷品就像他们是无敌的。例如,在Java中看到类似的东西并不罕见。
这很好,除了z实际上参与了该方法,但其他对象没有,而且要确保不会从obj上的表达式中得到异常。 打印输出所做的另一件事是它们会导致延迟。我看到过带有竞争条件的代码,在引入打印输出时,有时会“得到修复”。如果某些代码使用它,我不会感到惊讶。 |
|
|
5
2
我记得有一次我试着在Macintosh上调试一个程序(大约1991年),其中编译器为32K到64K之间的堆栈帧生成的清除代码是错误的,因为它使用了16位地址加法而不是32位加法(添加到地址寄存器的16位数量将在68000上进行符号扩展)。序列是这样的: copy stack pointer to some register push some other registers on stack subtract about 40960 from stack pointer do some stuff which leaves saved stack-pointer register alone add -8192 (signed interpretation of 0xA000) to stack pointer pop registers reload stack pointer from that other register 最终的结果是一切都很好 除了 保存的寄存器已损坏,其中一个保持不变(全局数组的地址)。如果编译器在代码段期间将变量优化为寄存器,它会在调试信息文件中报告,以便调试器能够正确地输出该变量。当常量被如此优化时,编译器显然不包含这样的信息,因为不需要这样做。我通过对数组地址进行“printf”跟踪,并设置断点,以便在printf之前和之后查看地址。调试器在printf之前和之后正确地报告了地址,但是printf输出了错误的值,所以我反汇编了代码并看到printf将寄存器a3推到堆栈上;在printf之前查看寄存器a3表明它有一个与数组地址相当不同的值(printf显示值a3 act保持正常状态)。 如果我不能同时使用调试器和printf(或者说,如果我不理解68000个汇编代码的话),我不知道我会如何跟踪到它。 |
|
|
6
1
我设法做到了。我正在从平面文件中读取数据。我的错误算法如下:
我发现我的函数会可靠地抛出一个SEG错误——除非在函数体的某个地方有一个printf,在这种情况下,它将完全按照我的预期工作。SEG故障的修复方法是分配文件的长度加上步骤2中的长度。 |
|
|
7
1
我也有过类似的经历。这是我的具体问题和原因:
循环条件有问题-我使用了'\n'而不是空字符'\0'。现在,我不知道printf是如何工作的,但是根据这个经验,我猜想它在变量之后使用了一些内存位置作为临时/工作空间。If a printf statement results in a '\n' character being written at some location after where my word is stored, then the FixCap function will be able to stop at some point. 如果我删除了printf,那么它会继续循环,寻找一个'\n',但永远找不到它,直到它出错为止。 因此,最后,问题的根本原因是有时我在我的意思是“0”时键入“n”。这是我以前犯的一个错误,也许我会再犯一个。但现在我知道要找它了。 |
|
|
8
0
嗯,也许你可以教他如何使用gdb或其他调试程序? 告诉他,如果一个臭虫因为“printf”而消失,那么它不会真正消失,可能会再次出现在后者。错误应该被修复,而不是被忽略。 |
|
|
9
0
这将在删除printf行时为您提供0的除法:
|
|
|
10
0
调试的情况如何?打印A
但是,如果将格式发送到
这完全取决于你在写什么和你在追的虫子。可用的工具是调试程序,
刀片螺丝刀比其他类型的好吗?取决于你需要什么。注意,我不是说断言是好是坏。它们只是另一种工具。 |
|
|
11
0
解决这个问题的一种方法是建立一个宏系统,这样可以很容易地关闭printfs,而不必在代码中删除它们。我用这样的东西:
|
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |