[lldb-dev] unit test "functionalities/step-avoids-no debug"
Doug Snyder
dsnyder at blueshiftinc.com
Tue Jul 22 17:30:34 PDT 2014
the test case “test_step_over_with_dwarf_python” for unit test "functionalities/step-avoids-no debug” passes when compiling the unit test with clang and fails when compiling with gcc, when i run the unit test in linux (ubuntu 14.04). note: to run this test case in linux, you have to comment out the “@skipIfLinux # intermittent failure” line.
the failure happens when the python code in TestStepNoDebug.py does the first self.thread.StepOut() after the breakpoint.
this appears to be caused by gcc generating significantly different code than clang. clang associates 20 bytes of machine code (all of the machine code related to the source line) to the breakpoint source line (line 12), but gcc only associates the first 3 bytes of machine code to line 12. gcc associates the remaining bytes related to line 12 with line 13. the corresponding code for both versions is shown at the bottom of this email.
this difference means that when the self.thread.StepOut() is executed in the clang version, the program steps to the source line of the calling routine (line 19), but the gcc version steps to the next source line (line 13). this mismatch causes TestStepNoDebug.py to report a failure not really caused by lldb, but really just a compiler difference.
it seems like the tests in TestStepNoDebug.py should be rewritten to include different tests for clang and gcc, or the test should be restructured to not rely on compiler differences - at least not clang and gcc differences.
shown below is the objdump for the clang version. the 20 bytes from 40055c thru 40056f (inclusive) are associated with source line 12 (no bytes are associated with source line 13).
int
called_from_nodebug_actual(int some_value)
{
400530: 55 push %rbp
400531: 48 89 e5 mov %rsp,%rbp
400534: 48 83 ec 10 sub $0x10,%rsp
400538: 48 b8 d4 06 40 00 00 movabs $0x4006d4,%rax
40053f: 00 00 00
400542: 89 7d fc mov %edi,-0x4(%rbp)
int return_value = 0;
400545: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp)
return_value = printf ("Length: %d.\n", some_value);
40054c: 8b 75 fc mov -0x4(%rbp),%esi
40054f: 48 89 c7 mov %rax,%rdi
400552: b0 00 mov $0x0,%al
400554: e8 b7 fe ff ff callq 400410 <printf at plt>
400559: 89 45 f8 mov %eax,-0x8(%rbp)
return return_value; // Stop here and step out of me
40055c: 8b 45 f8 mov -0x8(%rbp),%eax
40055f: 48 83 c4 10 add $0x10,%rsp
400563: 5d pop %rbp
400564: c3 retq
400565: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1)
40056c: 00 00 00 00
0000000000400570 <called_from_nodebug>:
}
shown below is the objdump for the gcc version. the 3 bytes from 400556 thru 400558 (inclusive) are associated with source line 12, and the 2 bytes from 400559 thru 40055a (inclusive) are associated with source line 13.
called_from_nodebug_actual(int some_value)
{
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: 48 83 ec 20 sub $0x20,%rsp
400535: 89 7d ec mov %edi,-0x14(%rbp)
int return_value = 0;
400538: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
return_value = printf ("Length: %d.\n", some_value);
40053f: 8b 45 ec mov -0x14(%rbp),%eax
400542: 89 c6 mov %eax,%esi
400544: bf 94 06 40 00 mov $0x400694,%edi
400549: b8 00 00 00 00 mov $0x0,%eax
40054e: e8 bd fe ff ff callq 400410 <printf at plt>
400553: 89 45 fc mov %eax,-0x4(%rbp)
return return_value; // Stop here and step out of me
400556: 8b 45 fc mov -0x4(%rbp),%eax
}
400559: c9 leaveq
40055a: c3 retq
000000000040055b <called_from_nodebug>:
doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140722/c0108dad/attachment.html>
More information about the lldb-dev
mailing list