(original) (raw)

Hello Alex, I am adding llvm-dev (cc) as other people might have similar questions.

If I understand correctly, debugging works with lli if you follow the instructions from https://www.llvm.org/docs/DebuggingJITedCode.html That's a good first step, because now the only question is what's the difference between lli and your code in main.cpp.

From what you describe I don't see an obvious problem. You say debugging main.cpp itself works fine. Here's a few things you can try to narrow down the problem:

\* Set a breakpoint in the constructor of MCJIT and make sure RegisterJITEventListener() is called.
\* Set a breakpoint in GDBJITRegistrationListener::notifyObjectLoaded() and check that the call to getObjectForDebug() returns a non-null result.
\* Enable logging for the JIT interface in LLDB and check that you get output like this:

(lldb) b my\_func
Breakpoint 1: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) log enable lldb jit
(lldb) run
JITLoaderGDB::SetJITBreakpoint looking for JIT register hook
JITLoaderGDB::SetJITBreakpoint setting JIT breakpoint
Process 46448 launched: '/path/to/main' (x86\_64)
JITLoaderGDB::JITDebugBreakpointHit hit JIT breakpoint
JITLoaderGDB::ReadJITDescriptorImpl registering JIT entry at 0x10e019830 (2872 bytes)
1 location added to breakpoint 1

Does that help?

Best
Stefan

On 17/03/2021 09:21, Alex wrote:
Hello

My name is Alex Fedchenko.

I try work with JIT-ed code.
As I see you work with llvm-project.
Could you help me with debugging IR-code.

Now I try is use combination with llvm::Module/ llvm::ExecutionEngine/ llvm::Function successful.
But I want debugging this code.
I can debug code from main.cpp , but I do not know how I can debug code from my.ll file.

I try explain what I can do ...

I have file "my.c" with function "int my\_func(int v)"
I created file my.ll use command "clang -g -c -S -emit-llvm my.c"

1)
If I write simple main.c file like:

extern int my\_func(int v);

int main() {
for( int i = 0; i < 10; i++) {
int n = -1;
n = my\_func( i );
}

return 0;
}

And create mail.ll use command "clang -g -c -S -emit-llvm main.c"
Then I linked my.ll and mail.ll use command "llvm-link my.ll main.ll -o all.ll"

After that I can debugging my\_func using gdb or lldb-12
(instruction here: https://www.llvm.org/docs/DebuggingJITedCode.html)
It is work fine (about debug process).

BUT
2)
When I write main.cpp file, where I use llvm::Module/ llvm::ExecutionEngine/ llvm::Function
like:

int main(int argc, char const \*argv\[\]) {
...
std::unique\_ptr mod = llvm::parseIRFile( "my.ll", error, context );
llvm::ExecutionEngine \*executionEngine = llvm::EngineBuilder( std::move( mod )).create();
...
llvm::Function \*f = executionEngine->FindFunctionNamed(llvm::StringRef("my\_func"));
...
llvm::GenericValue res = executionEngine->runFunction( f, arg );
...

I CAN NOT DUBUD my\_func :(
I build main.cpp : "clang++ -g main.cpp -O0 -o main"
I can debug main.cpp using gdb or lldb, but I can not set breakpoint in my\_func and debug my\_func :(
("./main" - work fine)

Could you help me?
Maybe you have any ideas how we can debug function what was load from Module and called over ExecutionEngine?
Maybe you know any person who can help me?
Or may be exist another way where we can called function from ll-file and debugged it from another running application (in debug mode).

Thank you for your response

Best regards
Alex F.
--   
https://flowcrypt.com/pub/stefan.graenitz@gmail.com