[llvm-dev] Debugging clang with debugger breakpoints ?

668 views
Skip to first unread message

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 3:02:24 PM11/4/19
to llvm...@lists.llvm.org
Hi All,

I want to understand some parts of ‘clang' by setting debug breakpoints.

I have successfully done so with “llc” but I found that debugger breakpoints do not work for ‘clang’

The apparent cause is that the clang code is run as a child process which is created in the ‘Execute' function of ‘Program.inc'. The debugger stops fine at breakpoints set on the main thread, but breakpoints do not work for any code that is executed as the child process. I am compiling with Xcode in case this makes a difference.

Thanks in advance for any help.

John
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

David Blaikie via llvm-dev

unread,
Nov 4, 2019, 3:03:53 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
Run clang with -### to get the underlying command line (the one that has the first argument "-cc1") and then run that command under the debugger instead.

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 3:30:02 PM11/4/19
to David Blaikie, llvm...@lists.llvm.org
Hi David,

Thank you for your help. Please, can you elaborate on this?. The command line that I get with -### starts with this:

clang version 9.0.1 (https://github.com/llvm/llvm-project.git 6e38ee067b8fa08792f551fb565bbb8ada4864b1)
Target: msp430
Thread model: posix
InstalledDir: /Users/joan/LLVM-9/llvm-project/build/Debug/bin
 "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang" "-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c"

So what should I set on the debugger?

Thanks

John

David Blaikie via llvm-dev

unread,
Nov 4, 2019, 3:44:15 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
that command:


"/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang" "-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c"

Or wherever you had: -emit-llvm -S -g main.c (or something like that)
You now have:  "-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c"

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 4:11:12 PM11/4/19
to David Blaikie, llvm...@lists.llvm.org
Hi David,

Thank you for your patience but I still don’t get it:  I don’t see how that is a “command”, as it’s just a list of strings that state command options.

I know how to use the debugger, this is what I attempt to debug:

 clang --target=msp430 -emit-llvm -c -S -Oz main.c   

The debugger works fine, but only on the main thread. However breakpoints do not work with the code that was invoked as a child process with posix_spawn 

The call to posix_spawn happens in file “Program.inc” on the ‘Execute' function. The actual call is this

Err = posix_spawn(&PID, Program.str().c_str(), FileActions,
                        /*attrp*/ nullptr, const_cast<char **>(Argv),
                        const_cast<char **>(Envp));

the variable Program.str() contains "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang” at this point, which I got with a breakpoint set at that point.

HOWEVER, any code that is run under that child process is not seen by the debugger. 

I hope my issue is clearer now.

Thanks anyway.

John

David Blaikie via llvm-dev

unread,
Nov 4, 2019, 4:15:25 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
On Mon, Nov 4, 2019 at 1:10 PM Joan Lluch <joan....@icloud.com> wrote:
Hi David,

Thank you for your patience but I still don’t get it:  I don’t see how that is a “command”, as it’s just a list of strings that state command options.

I know how to use the debugger, this is what I attempt to debug:

 clang --target=msp430 -emit-llvm -c -S -Oz main.c   

OK, so wherever you have that ^  you should replace it with this \/

clang "-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c"

It's just a ton of command line arguments, but it's not fundamentally different from the command you were already debugging - it's clang with some command line arguments.

This clang command (the one with the first argument of -cc1) will not invoke a child process - this is the command that the clang command you ran would run as its child process. So it's stripping off that layer so you can debug the underlying command/child process.

Zachary Turner via llvm-dev

unread,
Nov 4, 2019, 4:18:56 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
On Mon, Nov 4, 2019 at 1:11 PM Joan Lluch via llvm-dev <llvm...@lists.llvm.org> wrote:
Hi David,

Thank you for your patience but I still don’t get it:  I don’t see how that is a “command”, as it’s just a list of strings that state command options.

This is the output you pasted after running the command:

> "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang" "-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c" 

Yes it is a list of strings.  But the first string "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang" is a command.  The rest are arguments.  So you should set your debugger to run this command:

"/Users/joan/LLVM-9/llvm-project/build/Debug/bin/clang" 

with these arguments:

"-cc1" "-triple" "msp430" "-emit-llvm" "-disable-free" "-main-file-name" "main.c" "-mrelocation-model" "static" "-mthread-model" "posix" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-nostdsysteminc" "-dwarf-column-info" "-debugger-tuning=gdb" "-target-linker-version" "305" "-momit-leaf-frame-pointer" "-coverage-notes-file" "/Users/joan/Documents-Local/Relay/RelayNou/main.gcno" "-resource-dir" "/Users/joan/LLVM-9/llvm-project/build/Debug/lib/clang/9.0.1" "-internal-isystem" "/Users/joan/LLVM-9/llvm-project/build/Debug/bin/../msp430/include" "-Oz" "-fdebug-compilation-dir" "/Users/joan/Documents-Local/Relay/RelayNou" "-ferror-limit" "19" "-fmessage-length" "224" "-fobjc-runtime=gcc" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-vectorize-slp" "-faddrsig" "-o" "main.ll" "-x" "c" "main.c"

Does that make sense?

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 4:23:19 PM11/4/19
to Zachary Turner, llvm...@lists.llvm.org
Hi David,

I understand what you say, but have you actually read my messages? I don’t think so,

Anyway, I will repost the question in case someone else can help.

Thanks

John

Zachary Turner via llvm-dev

unread,
Nov 4, 2019, 4:27:09 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
You hit Reply on my email but then addressed David.  So I want to make sure you saw my suggestion.  Let me know if you tried that and/or whether or not it solved your problem.

Zach

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 4:47:18 PM11/4/19
to Zachary Turner, llvm...@lists.llvm.org
Sorry Zach, my apologies. 

I understood now what you mean. I tried and it works!. 

But now I found that LLVM_DEBUG statements and other output to the console doesn’t show. How do I get that back?.

Thanks 

John 

Zachary Turner via llvm-dev

unread,
Nov 4, 2019, 4:52:13 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
I'm not very familiar with this macro, as it seems to be new, but looking at llvm/include/llvm/Support/Debug.h it has this comment:

// In particular, just wrap your code with the LLVM_DEBUG() macro, and it will
// be enabled automatically if you specify '-debug' on the command-line.
// LLVM_DEBUG() requires the DEBUG_TYPE macro to be defined. 

So, perhaps you should try adding -debug to your command line and seeing if that fixes the problem.

If that doesn't fix it, someone else may need to help as I'm not familiar with this issue specifically.

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 5:13:44 PM11/4/19
to David Blaikie, llvm...@lists.llvm.org

Hi David,

I understand now what you mean, and it worked. I replied already to someone else. Please accept my apologies as I misread a message before.

Thanks for your help.

John.

Joan Lluch via llvm-dev

unread,
Nov 4, 2019, 5:14:28 PM11/4/19
to Zachary Turner, llvm...@lists.llvm.org
Hi Zach,

I appreciate that.  The -debug option is apparently not known in this context, this is what the console pops up immediately:

[0;1;31merror: [0munknown argument: '-debug'[0m
Program ended with exit code: 1

I believe this is now a more general issue because all sort of output to the console is missing, not only LLVM_DEBUG() macro statements. It seems to me that I need to redirect console output to the ide console somehow. This is apparently done automatically when debugging the main thread in the usual way, but it’s not working in this case. Still, having working breakpoints and debug variables is a great improvement. So thanks for that.

John.

mayuyu.io via llvm-dev

unread,
Nov 4, 2019, 11:55:28 PM11/4/19
to Joan Lluch, llvm...@lists.llvm.org
I assume you need -mllvm -debug

Zhang

David Greene via llvm-dev

unread,
Nov 8, 2019, 11:42:48 AM11/8/19
to Joan Lluch, llvm...@lists.llvm.org
Joan Lluch via llvm-dev <llvm...@lists.llvm.org> writes:

> Hi All,
>
> I want to understand some parts of ‘clang' by setting debug breakpoints.
>
> I have successfully done so with “llc” but I found that debugger breakpoints do not work for ‘clang’
>
> The apparent cause is that the clang code is run as a child process
> which is created in the ‘Execute' function of ‘Program.inc'. The
> debugger stops fine at breakpoints set on the main thread, but
> breakpoints do not work for any code that is executed as the child
> process. I am compiling with Xcode in case this makes a difference.

David provided one answer but if your debugger supports it, an easier
way is to set the debugger to follow child processes. With gdb it would
be "set follow-fork-mode child".

-David

Joan Lluch via llvm-dev

unread,
Nov 8, 2019, 11:50:08 AM11/8/19
to David Greene, llvm...@lists.llvm.org
Hi David,

I’m using the default Xcode debugger which happens to be Apple’s version of LLDB. Is there something equivalent for it?.

Thanks

John

David Greene via llvm-dev

unread,
Nov 8, 2019, 12:32:35 PM11/8/19
to Joan Lluch, llvm...@lists.llvm.org
Joan Lluch <joan....@icloud.com> writes:

> I’m using the default Xcode debugger which happens to be Apple’s
> version of LLDB. Is there something equivalent for it?.

A really old SO post indicates not:

https://stackoverflow.com/questions/19204395/lldb-equivalent-of-gdbs-follow-fork-mode-or-detach-on-fork

That may very well have changed since, I don't know. I don't use LLDB
at the moment.

Reply all
Reply to author
Forward
0 new messages