Benchmarking and Explaining Large Language Model-based Code Generation: A Causality-Centric Approach